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;
}