#LeetCode OJ #11 Container With Most Water

来源:互联网 发布:淘宝iuv 编辑:程序博客网 时间:2024/04/28 03:56

https://leetcode.com/problems/container-with-most-water/

暴力O(n^2)肯定是面试会失败的

分治可能O(n^log(n))

但是有O(n)做法

学到的思维方式:看解的性质,然后构造解,遍历所有可能的解,找出最优

假设解的边界分别为left,right

那么有如下性质:

(1)left左边不应该有比left更大的高度left',否则左边界取left'得到的解必然比left大

(2)right右边不能有比right更大的高度right',否则右边界取right得到的解必然比right大


那么写代码怎么利用这个性质?

初始范围就是最左和最右,这个范围一定包含了最优解,我们要做的是把这个范围缩小到最优区间or遍历所有符合性质的区间取最优值。

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>using namespace std;class Solution {public:    int maxArea(vector<int>& height) {       int ret=0;       int left=0,right=height.size()-1;       while(left < right){       ret = max(ret, min(height[right],height[left])*(right-left));       if(height[right]>height[left]){       int tmp = left;       left++;       while(left < right && height[left] <= height[tmp])left++;       }else{       int tmp = right;       right--;       while(right > left && height[right] <= height[tmp])right--;       }       }       return ret;    }};int main(){freopen("incon.txt","r",stdin);Solution s;vector<int> v;int t,n;while(cin >> n){for(int i=0;i<n;i++){cin >> t;v.push_back(t);}cout << s.maxArea(v) << endl;}return 0;}




1 0