题目:
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.
代码:
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; } };