#LeetCode OJ #11 Container With Most Water

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值