description:

Input: [1,8,6,2,5,4,8,3,7]Output: 49

思路1:

  从(1,a1)开始向后算面积,需要两层n循环,时间复杂度n2

思路2:

  找出数组中最大的数,将其与次大,第三大数求面积,依次类推,也需要两层循环,还需要额外排序,时间复杂度n2

  因为找出最大数并且并不知道输入数据的规律(有可能很杂乱),所以每个都有必要算,采取思路1.

  代码实现如下:

class Solution {
public int maxArea(int[] height) {
int max = 0;
for(int i = 0; i < height.length; i++){
int mid = maxSpare(height, i);
max = max >= mid ? max : mid;
}
return max;
}
// 从index = start开始向后对每一对求面积
private int maxSpare(int[] height, int start){
int maxArea = 0;
for(int i = start + 1; i < height.length; i++){
int area = countArea(height[start], height[i], i - start);
maxArea = maxArea > area ? maxArea : area;
}
return maxArea;
}
private int countArea(int height1, int height2, int width){
int result = 0;
int height = height1 > height2 ? height2 : height1;
result = height * width;
return result;
}
}

but only faster 15.40% of Java online submissions for Container With Most Water.

讨论区看见O(n)的算法:

(1)left = 0, right = n-1,计算left~right之间的面积

(2)若left的高度小于right的高度,则查找2~n-1之间大于left的位置,更新left,计算面积;否则,查找中间大于right高度的位置,作为新right,计算面积

(3)直到right< left

思考:

  设以left=1为基点不变,找到一个right值,使left~right之间的矩形面积最大,则存在以下三种情况:

①aleft > aright

  此时高度height=aright,width=(n-1),所求面积可能小于等于以a1为左边的最大面积。

②aright为右边起第一个大于等于aleft的边,设right=n-1

  此时height=aleft,width= (n-1)-1,面积有可能等于为以a1为左边的最大面积。

③aright不为右边起第一个大于等于aleft的边,设right=n-2

  此时虽然height=aleft,但是width=(n-2)-1小于②中的width,所以③中求得的面积小于②中的面积,即③中的情况是不考虑的

  所以可以两头推进。参考如下代码:

class Solution {
public int maxArea(int[] height) {
int max = 0, left = 0, right = height.length-1;
while(left < right){
int area = Math.min(height[left],height[right]) * (right - left);
max = max > area ? max : area;
if(height[left] < height[right]){
int base = height[left];
while((height[left] <= base) && (left < right)){
left++;
} // end while
}
else{
int base = height[right];
while((height[right] <= base) && (left < right)){
right--;
} // end right
} // end if-else
} // end while
return max;
} // end maxArea
}
Runtime: 7 ms, faster than 55.28% of Java online submissions for Container With Most Water.

算法很重要 

一个3ms的代码:

class Solution {
  public int maxArea(int[] height) {
    int maxarea = 0;
    int temparea = 0;
    int i = 0;
    int j = height.length -1;
    while(i < j) {
      if(height[i] <= height[j]) {
        temparea = height[i] * (j-i);
        i++;
      }
      else {
         temparea = height[j] * (j-i);
         j--;
      }
      if(temparea > maxarea) {
         maxarea = temparea;
      }
    }
    return maxarea;
  }
}

[leecode]---11.container with most water的更多相关文章

  1. leetcode 11. Container With Most Water 、42. Trapping Rain Water 、238. Product of Array Except Self 、407. Trapping Rain Water II

    11. Container With Most Water https://www.cnblogs.com/grandyang/p/4455109.html 用双指针向中间滑动,较小的高度就作为当前情 ...

  2. Leetcode 11. Container With Most Water(逼近法)

    11. Container With Most Water Medium Given n non-negative integers a1, a2, ..., an , where each repr ...

  3. LeetCode Array Medium 11. Container With Most Water

    Description Given n non-negative integers a1, a2, ..., an , where each represents a point at coordin ...

  4. 刷题11. Container With Most Water

    一.题目说明 11.Container With Most Water,这个题目难度是Medium. 二.我的做法 乍一看,简单啊,两个for循环就可以了,我在本地写的. #include<io ...

  5. 如何装最多的水? — leetcode 11. Container With Most Water

    炎炎夏日,还是呆在空调房里切切题吧. Container With Most Water,题意其实有点噱头,简化下就是,给一个数组,恩,就叫 height 吧,从中任选两项 i 和 j(i <= ...

  6. 《LeetBook》leetcode题解(11):Container With Most Water[M] ——用两个指针在数组内移动

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  7. LeetCode 11. Container With Most Water (装最多水的容器)

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

  8. [LeetCode] 11. Container With Most Water 装最多水的容器

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

  9. LeetCode#11. Container With Most Water

    问题描述 Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ...

随机推荐

  1. C# 读取xml——XmlReader和XElement

    1.有些xml文件头部有DTD,程序解析的时候会报错 如:其他信息: 打开外部 DTD“file:///E:/PM数据/MeContext=CDF2775/MeasDataCollection.dtd ...

  2. css的扩展技术

    CSS的扩展技术 (在原来的CSS语言的基础上扩展了js,可以在里面写js ) 一.less 定义: @color:red; //定义颜色 @body-color:blue; @div-color:y ...

  3. angularjs简单介绍和特点

    首先angular是一个mvc框架, 使用mvc解耦, 采用model, controller以及view的方式去组织代码, 会将一个html页面分成若干个模块, 每个模块都有自己的scope, se ...

  4. 在Javascript中数组对象(json)里元素相同的操作

    1.数组对象元素相同,分组显示   let arry = [ { expensedate: '2018/09/29', amount: 1, type: '交通费' }, { expensedate: ...

  5. bat实现往hosts文件追加内容

    做个笔记. @echo off ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::: ...

  6. [c/c++] programming之路(26)、结构体

    一.初始化字符串 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include&l ...

  7. JS版剑指offer

    介绍 用JavaScript刷完了剑指offer,故总结下每道题的难度.解决关键点,详细题解代码可以点链接进去细看. 关于JS刷题的技巧可以看我之前的这篇:JS刷题总结. 剑指offer的题目在牛客网 ...

  8. loj 3090 「BJOI2019」勘破神机 - 数学

    题目传送门 传送门 题目大意 设$F_{n}$表示用$1\times 2$的骨牌填$2\times n$的网格的方案数,设$G_{n}$$表示用$1\times 2$的骨牌填$3\times n$的网 ...

  9. {408} client block at 0x005D4D10, subtype 0, 64 bytes long.a CButton object at $005D4D10, 64 bytes long

    现象:mfc动态生成了很多控件,new的,退出时也delet了,但是还是出现了标题的错误 解决:在任何可以执行的地方加代码: CMFCVisualManager ::SetDefaultManager ...

  10. Xcode9,cocoaPod执行pod install时报错,一行命令即可解决。