题目:

Given n non-negative integers a1a2, ..., an, where each represents a point at coordinate (iai). n vertical lines are drawn such that the two endpoints of line i is at (iai) 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.

Tag:

Array; Two Pointers

体会:

1. 这道题我觉得是双指针的一个创新用法。之前的双指针都是一主一辅,辅助的那个不断去探测下一个,然后主要的那个会根据探测结果做出相应动作,比如 Merge Sorted Array,这道题的双指针两个人是同等重要性,根据其他的判定条件来决定下一次移动谁。

2. 这道题之所以是双指针是同等位置,也可以从另外一个角度来感受,就是要知道左边那条线“和”右边那条线的位置,两个都是未知的,都是要确定的。

3. 回到题目上,O(N)的解法。代码很简单,可是能想到不容易。(我也是炒的别人的思路)。为什么每次是那样移动指针呢?假设h[left] < h[right],我们管当前用来围城面积的左边的这条竖着的直线叫Line left, 管右边的那条线要Line right。那么当前的面积就是 (area = (right -  left) * h[left])。好了,我们假设还有一个更大的面积,下面我们要说明这个更大的面积一定不会是和Line left围成的。

假设这个更大的面积的其中一条边是Line x, (Line x肯定是位于Line left 和Line right之间啦)。那么Line和max围成的面积是( ( x - left) * h[left]) , 这个面积肯定是小于原来的 (right - left ) * h[left]的啦。

综上,我们肯定是要移动Line left了。

4. 可以从一个更数学的角度来解释这个问题:

  假设left, right 是line left和line right在x轴上的坐标,起始时, left = 0, right = 最右边。那么

  area = ( right - left ) * min (h[left], h[right])

  怎么样才能使这个函数有更大的值呢?不管移动左边的线还是右边的线,结果都是(right - left)的值会变小,若要area的值变大,只能是把min(h[left], h[right])的值变大才有可能。所以如果我们继续保留较矮的那条线的话,这个min值一定不会变大,所以面积肯定不会变大;而保留原本较高的那条线,是有可能使min值变大的,所以只能是保留这条线。

 class Solution {
public:
int maxArea(vector<int> &height) {
int left = ;
int right = height.size() - ;
int result = ;
int area = ;
while (left < right) {
if (height[left] < height[right]) {
area = (right - left) * height[left++];
} else {
area = (right - left) * height[right--];
}
if (area > result) {
result = area;
}
}
return result;
}
};

最新文章

  1. 用802.11n 加速,将android手机屏幕投影到win7电脑上
  2. 注解:【有连接表的】Hibernate单向N-&gt;N关联
  3. 关于WebDAV带来的网站潜在安全问题的疑问
  4. 【数位dp】
  5. linux ss 网络状态工具
  6. 分布式模式之broker模式
  7. JavaScript中关于创建对象的笔记
  8. zoj 3777 Problem Arrangement
  9. java final 和instanceof 关键字
  10. 由命名空间函数而引发思考--js中的对象赋值问题
  11. 安装PHP
  12. 求一个数组中重复数字的个数,要求复杂度为O(n)
  13. 使用sort对数组中的对象的某个属性进行排序
  14. MT【52】空间法向量理解直线条数
  15. css---颜色过渡渐变
  16. 微信小程序开发攻略
  17. Shiro:ajax的session超时处理
  18. iOS UTI
  19. AVL树Python实现(使用递推实现添加与删除)
  20. 第五章 if语句

热门文章

  1. hdu5323 Solve this interesting problem(爆搜)
  2. hdfs-over-ftp安装与配置
  3. No1_8.类和对象2_Java学习笔记_对象
  4. 影响MySQL性能的五大配置参数
  5. JavaScript中的一些细节
  6. 什么是JSONP以及它是怎么产生的
  7. 一个Restful Api的访问控制方法
  8. xen之基本搭建
  9. Qt修改文件内容
  10. 【转】GCC4.6编译的warning -Werror