No.011: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 container, such that the container contains the most water.
Note: You may not slant the container.
官方难度:
Medium
翻译:
给定n个非负整数a1,a2,...,an,每一个数值代表坐标轴上的坐标(i,ai)。
画上n条垂直于横坐标的竖线,用于连接点(i,ai)和(i,0)。找到两条线,与x轴一起形成一个容器,能够容纳最多的水。
注意容器不能倾斜。
方法一:
- 利用一个二次循环,同时维护一个最大面积max。
方法一的解题代码:
     private static int method_1(int[] height) {
         int max = 0;
         for (int i = 0; i < height.length - 1; i++) {
             for (int j = i + 1; j < height.length; j++) {
                 int area = Math.min(height[i], height[j]) * (j - i);
                 if (max < area) {
                     max = area;
                 }
             }
         }
         return max;
     }
method_1
方法二:
- 显然第一种方法的效率是极低的。
- 我们注意到,虽然高是由输入决定的,但是底的值却是可控的。有一个思想,维护一个最大高度maxHeight记录遇到的最大高度,在内循环中自后向前遍历,这样一来,底的值始终在减小。这就意味着只需要考虑高的值,就能决定整个容器的面积。所以在遇到小于maxHeight的情况时,可以直接跳过本次循环,不需要再次计算面积。
方法二的解题代码:
     private static int method_2(int[] height) {
         int max = 0;
         for (int i = 0; i < height.length; i++) {
             int maxHeight = 0;
             // 内循环反向遍历
             for (int j = height.length - 1; j > i; j--) {
                 int h = Math.min(height[i], height[j]);
                 // 因为底越来越小,所以只有高度大于最高高度,才有比较面积的意义
                 if (h > maxHeight) {
                     // 不考虑面积比较结果,高先赋值
                     maxHeight = h;
                     if (h * (j - i) > max) {
                         max = h * (j - i);
                     }
                 }
             }
         }
         return max;
     }
method_2
方法三:
- 方法二仍然是一个时间复杂度为O(n^2)的二次循环,但是还有优化的策略。
- 在一次内循环结束之后,进入下一次内循环,如果height[i]小于上一次的长度,可以直接跳过这次循环。这样一来看似二次循环的问题,可以通过从两侧向中间夹逼,转化为一次循环的问题。
方法三的解题代码:
     public static int maxArea(int[] height) {
         if (height == null || height.length < 2) {
             throw new IllegalArgumentException("Input error");
         }
         // 初始面积
         int left = 0, right = height.length - 1;
         int area = (right - left) * Math.min(height[left], height[right]);
         // 左右侧开始的最长高度
         int leftMax = height[left];
         int rightMax = height[right];
         // 从两侧向中间夹逼,即底在不断变小
         while (left < right) {
             if (height[left] < height[right]) {
                 left++;
                 // 更小的高没有比较价值
                 if (height[left] <= leftMax) {
                     continue;
                 } else {
                     leftMax = height[left];
                 }
                 area = Math.max(area, (right - left) * Math.min(height[left], height[right]));
             } else {
                 right--;
                 if (height[right] <= rightMax) {
                     continue;
                 } else {
                     rightMax = height[right];
                 }
                 area = Math.max(area, (right - left) * Math.min(height[left], height[right]));
             }
         }
         return area;
     }
maxArea
相关链接:
https://leetcode.com/problems/container-with-most-water/
PS:如有不正确或提高效率的方法,欢迎留言,谢谢!
No.011:Container With Most Water的更多相关文章
- LeetCode第[11]题(Java):Container With Most Water 标签:Array
		题目难度:Medium Given n non-negative integers a1, a2, ..., an, where each represents a point at coordina ... 
- LeetCode第[11]题(Java):Container With Most Water (数组容器盛水)——Medium
		题目难度:Medium Given n non-negative integers a1, a2, ..., an, where each represents a point at coordina ... 
- LeetCode11:Container With Most Water
		public int MaxArea(int[] height) { ; ; ; while(start<end) { max=Math.Max(max,Math.Min(height[star ... 
- No.011 Container With Most Water
		11. Container With Most Water Total Accepted: 86363 Total Submissions: 244589 Difficulty: Medium Giv ... 
- LeetCode--No.011 Container With Most Water
		11. Container With Most Water Total Accepted: 86363 Total Submissions: 244589 Difficulty: Medium Giv ... 
- 《LeetBook》leetcode题解(11):Container With Most Water[M] ——用两个指针在数组内移动
		我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ... 
- [LintCode] Container With Most Water 装最多水的容器
		Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). ... 
- 67. Container With Most Water
		Container With Most Water Given n non-negative integers a1, a2, ..., an, where each represents a poi ... 
- LeetCode:Container With Most Water,Trapping Rain Water
		Container With Most Water 题目链接 Given n non-negative integers a1, a2, ..., an, where each represents ... 
随机推荐
- Git Tips
			撤销已经推送到远程仓库的最后一次提交,要小心这么操作,因为远程仓库还有别人在使用 $ git reset --hard HEAD^ $ git push -f origin master 从仓库中提出 ... 
- 使用pathogen管理Vim插件并托管到Github
			参照文章[1][2]的办法,将vim打造成一个Python开发环境.文章中使用的是 pathogen + git 来管理 Vim 插件的.对这种方式还不太明白的同学可以参考[3]中的介绍.pathog ... 
- Versions 出现 SVN Working Copy xxx locked
			Versions处于选中状态,Finder的导航栏就是Versions的导航栏,如下图,Action - Cleanup...,就可以解锁了 
- Oracle数据库入门——常用的数据字典
			一.oracle数据字典主要由以下几种视图构成:1.user视图以user_为前缀,用来记录用户对象的信息 2.all视图以all_为前缀,用来记录用户对象的信息及被授权访问的对象信息 3.dba视图 ... 
- MFC窗口和控件大小等比例变化
			第一步:OnInitDialog里保存对话框及其所有子窗体的Rect区域 CRect rect; GetWindowRect(&rect); listRect.AddTail(rect);// ... 
- tengine-2.1.0 + lua + base64
			参考:http://my.oschina.net/eduosi/blog/169606 安装 readline,lua 编译需要用到这个,centos 可以通过 yum 直接安装,如果不需要系统的,可 ... 
- QWidget::paintEngine: Should no longer be called
			Qt新手,其实并不知道出现这个问题的本质原因,我的问题在于paintEvent中使用的painter是类的成员而不是临时新建的局部变量,改为使用局部变量问题就消失了. 
- Safari下默认10位数字为电话号码,点击拨号
			<meta content="telephone=no" name="format-detection"/> 
- 回归 从注释开始 appledoc
			好久没有管理这个blog了,些许空虚.不知道今天的回归能否坚持.简单介绍一个第三方注释 -- appledoc appledoc http://gentlebytes.com/appledoc/ 安装 ... 
- UIView 与 CALayer
			联系: 1. UIView 有个属性 layer,可以返回它的主 CALayer 实例:CALayer *layer = myView.layer 2. 一个 UIView 可以有多个 CALayer ... 
