【Container With Most Water】cpp

题目:

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.

代码:

class Solution {
public:
    int maxArea(vector<int>& height) {
            if ( height.size()<2 ) return 0;
            int max_area = 0;
            int left = 0;
            int right = height.size()-1;
            while ( left<right )
            {
                if ( height[left]<=height[right] )
                {
                    max_area = std::max(max_area, (right-left)*height[left]);
                    left++;
                }
                else
                {
                    max_area =  std::max(max_area, (right-left)*height[right]);
                    right--;
                }
            }
            return max_area;
    }
};

tips:

试图用DP去做,但是没想出来;最后无奈落入了Greedy的俗套solution。

这个greedy的思路也是蛮巧的:从两头开始往中间greedy,头尾两个greedy一起变化才得到greedy的条件。

=======================================

第二次过这道题,这道题题意不清晰:如果选了某两个板子,就当其他板子不存在。

class Solution {
public:
    int maxArea(vector<int>& height) {
            int l = 0;
            int r = height.size()-1;
            int ret = 0;
            while ( l<r )
            {
                if ( height[l]<=height[r] ) 
                {
                    ret = max(ret, (r-l)*height[l]);
                    l++;
                }
                else
                {    
                    ret = max(ret, (r-l)*height[r]);
                    r--;
                }
            }
            return ret;
    }
};

 

posted on 2015-05-30 15:22  承续缘  阅读(129)  评论(0编辑  收藏  举报

导航