码迷,mamicode.com
首页 > 其他好文 > 详细

[leetcode]_Container With Most Water

时间:2014-05-29 17:40:09      阅读:312      评论:0      收藏:0      [点我收藏+]

标签:c   style   class   blog   code   java   

题目:在二维坐标系下,有很多个挡板,有两个挡板之间能够积蓄的水的最大面积。如下图所示:

bubuko.com,布布扣

 

思路:我只想到暴力解法,用O(n2)的时间复杂度算出任意两个挡板形成的面积,这必须的过不了。

优化解法:O(n).

用两个指针 i 和 j 指向整个height[]数组的头尾。

if i 指向的高度 < j 指向的高度 , then 用 i 指向的高度 * i , j之间的距离 求的面积,i 指针向后移。

  (i指针向后移的原因:因为当前的面积由i 的高度决定,相当于现在获得以i指针为一边挡板的最大面积,因为随着j的向内移动,水平宽度肯定是降低的,然后及时j的高度高于i的高度,也因为矩形面积由短板边<i的高度>决定,因此不会比现在的面积更大。)

同理如果 j 指向的高度 < i 指向的高度, 将j指针向内移动。

 

代码:

bubuko.com,布布扣
 1    public int maxArea(int[] height) {
 2         int i = 0 , j = height.length - 1;
 3         int max = 0 ;
 4         while(i < j){
 5             int tempArea = 0;
 6             if(height[i] < height[j]){
 7                 tempArea = height[i]*(j - i);
 8                 i++;
 9             }else{
10                 tempArea = height[j]*(j - i);
11                 j--;
12             }
13             if(tempArea > max) max = tempArea;
14         }
15         return max;
16     }
bubuko.com,布布扣

这种精妙的算法,代码很简单,思路很难想到。即使知道了正确解法,还是觉得心有不安。待下次遇见类似问题再深化思考吧。

[leetcode]_Container With Most Water,布布扣,bubuko.com

[leetcode]_Container With Most Water

标签:c   style   class   blog   code   java   

原文地址:http://www.cnblogs.com/glamourousGirl/p/3758462.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!