LeetCode 11 Container With Most Water(最大水容器)

翻译

给定n个非负整数a1,a2,...,an,其中每个代表一个点坐标(i,ai)。

n个垂直线段例如线段的两个端点在(i,ai)和(i,0)。

找到两个线段,与x轴形成一个容器,使其包含最多的水。

备注:你不必倾倒容器。

翻译

Given n non-negative integers a1, a2, ..., an,
where each represents a point at coordinate (i, ai). 

n vertical lines are drawn
such that the two endpoints of line i is at (i, ai) and (i, 0). 

Find two lines, which together with x-axis forms a container,
such that the container contains the most water.

Note: You may not slant the container.

题目的意思是,数组中的每个数对应一条线段的长度,索引对应x坐标,两个索引可以组成一个底部的宽,高度就是前面所说的线段的长度,而既然是要盛水,高度就是两个线段中较短的一个。

那么该怎么去解题呢?

我水平不行,英文也不行,所以每次一开始都是用最简单的方法,旨在试试有没有理解题目的意思,即便超出时间/空间限制也没事。

public int MaxAera(int[] height)
{
    int area = 0;
    for (int i = 0; i < height.Length; i++)
    {
        for (int j = i + 1; j < height.Length; j++)
        {
            if (height[i] < height[j])
                area = Math.Max(area, countArea(height, i, j));
        }
    }
    return area;
}

public int countArea(int[] height, int x, int y)
{
    int h = height[x] > height[y] ? height[x] : height[y];
    int info = h * (y - x);
    return info;
}

很明显这样是不行的……

那有那些部分可以简化呢?

前面的方法是从数组左侧开始逐个向右遍历所有情况,但明显可以从两侧向中间进发,通过对应的max函数来保留最大的面积。

当从左边进入到图中线段1位置,右边进入到线段5的时候。你不会想着右边继续进入线段6和7,因为你就是从那边过来的。

那么是该左边的往右走,还是右边的往左走呢?

如果是右边的往左走,虽然线段1变成了线段2,但是线段1到线段5的距离比线段2大,因此面积也大。所以走了之后面积反而小了。

如果是右边的往左走,亲自行脑补:线段3和线段4是在同一位置,如果是到了线段4,那么容器的高度将从原本的线段5的长度变成线段1的长度,(虽然由于距离的变小,总面积仍可能变小,但请继续往下看),而如果到了线段3,虽然高度变小了,宽度变小了,但,那又何妨呢?因为你的maxArea还是在那里的,每次的计算后,当且仅当高度超过原本的高度之后才会覆盖原来的值。

maxArea = Max(maxArea,newArea);

也就是说,高度如果没有超过,就没有什么影响。

至于你说它会不会因为自增和自减而发生越界,如果

int[] height = {10, 1, 2, 3, 4, 5, 6, 7, 11};

假设这里的10和11对应线段1和线段6,请自行脑补:去掉线段7,既然线段1短于线段6,那么发生的是left++,而不是left–。所以,并不会越界的。反之,亦然。

public class Solution
{
    public int MaxArea(int[] height)
    {
        int left = 0, right = height.Length - 1;
        int maxArea = 0;
        while (left < right && left >= 0 && right <= height.Length - 1)
        {
            maxArea = Math.Max(maxArea, Math.Min(height[left], height[right]) * (right - left));
            if (height[left] > height[right])
            {
                right--;
            }
            else
            {
                left++;
            }
        }
        return maxArea;
    }
}

明天继续,加油!

时间: 2024-11-08 22:11:16

LeetCode 11 Container With Most Water(最大水容器)的相关文章

[LeetCode]11.Container With Most Water

[题目] Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a con

Container With Most Water

Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a containe

[LeetCode]42.Trapping Rain Water

[题目] Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. For example,  Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6. The above elevation map is represente

&lt;font color=&quot;red&quot;&gt;[置顶]&lt;/font&gt;

Profile Introduction to Blog 您能看到这篇博客导读是我的荣幸,本博客会持续更新,感谢您的支持,欢迎您的关注与留言.博客有多个专栏,分别是关于 Windows App开发 . UWP(通用Windows平台)开发 . SICP习题解 和 Scheme语言学习 . 算法解析 与 LeetCode等题解 . Android应用开发 ,而最近会添加的文章将主要是算法和Android,不过其它内容也会继续完善. About the Author 独立 Windows App 和

leetcode难度及面试频率

转载自:LeetCode Question Difficulty Distribution               1 Two Sum 2 5 array sort         set Two Pointers 2 Add Two Numbers 3 4 linked list Two Pointers           Math 3 Longest Substring Without Repeating Characters 3 2 string Two Pointers      

LeetCode All in One 题目讲解汇总(持续更新中...)

终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通过OJ,或是有更好的解法,或是有任何疑问,意见和建议的话,请一定要在对应的帖子下面评论区留言告知博主啊,多谢多谢,祝大家刷得愉快,刷得精彩,刷出美好未来- 博主制作了一款iOS的应用"Leetcode Meet Me",里面有Leetcode上所有的题目,并且贴上了博主的解法,随时随地都能

LeetCode总结【转】

转自:http://blog.csdn.net/lanxu_yy/article/details/17848219 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近完成了www.leetcode.com的online judge中151道算法题目.除各个题目有特殊巧妙的解法以外,大部分题目都是经典的算法或者数据结构,因此做了如下小结,具体的解题思路可以搜索我的博客:LeetCode题解 题目 算法 数据结构 注意事项 Clone Graph BFS 哈希表 Word Ladder II

Docker usage basics

使用docker的一些基本操作 1. 安装docker, 启动docker 服务 2. 检查版本信息 3. 从docker hub搜索, 下载镜像 4. 启动container 5. container交互模式 6. 改变docker后台进程的监听端口 7. 连接到非默认端口或远程docker后台进程 8. 启动后台container 9. 查看运行或未运行的container 10. 控制container(停止,重启,删除等) 11. container net 12. container

[LeetCode 第11题] -- Linked List Cycle II

题目链接: Linked List Cycle II 题目意思: 给定一个链表,如果链表有环求出环的起点,否则返回NULL 解题思路:      1. 判断链表是否有环: 两个指针,一个一次走一步,一个一次走两步,如果指针相遇说明有环,否则无环.     2. 如果有环的情况下,我们可以画个图(图片来自网络)                   假设两个指针在z点相遇.则          a. 指针1走过路程为a + b:指针2走过的路程为 a+b+c+b          b. 因为指针2的