[leetcode] Container With Most Water

来源:互联网 发布:华为手机知乎 编辑:程序博客网 时间:2024/06/06 18:06

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 linei 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. 


Solution: 

1. A stupid implementation, you can use two layer-for to traverse all the cases. Nevertheless, it's not a good method to save time. The time overhead is O(n^2):

int maxArea(vector<int> &height) {int maxarea = 0;for(int left = 0; left < height.size()-1; left++) {for (int right = left+1; right < height.size(); right++) {if(min(height[left], height[right]) * (right-left) > maxarea) {maxarea = min(height[left], height[right])*(right-left);}}}return maxarea;}

2. Use two pointer to scan the array from the header and tail respectively, where the time overhead is O(n).

int maxArea1(vector<int> &height) {int left = 0;int right = height.size() - 1;int maxArea = min(height[left], height[right]) * (right-left);while(left < right) {if(height[left] <= height[right]) {int i = left+1;while(height[i] <= height[left] && i < right) { ++i; }left = i;} else {int j = right-1;while(height[j] <= height[right] && j > left) { --j; }right = j;}maxArea = maxArea < min(height[left], height[right]) * (right-left) \? min(height[left], height[right]) * (right-left) : maxArea;}return maxArea;}





0 0