地址:https://leetcode-cn.com/problems/container-with-most-water/
思路:一,先将直线(i,ai)按高度由小到大排序,再由大开始遍历ai,同时记录以遍历的直线的下标最值L,R,这样能够保证区间的高度是ai,然后记录与下标最值所形成的区间面积最大值即可 时间复杂度为O(n*log(n))
二,博客https://blog.csdn.net/qq_41231926/article/details/81407474
利用两指针从两端向中间扫描,每次比较两指针所在的直线的高度,舍弃掉高度低的,同时记录指针所形成的面积最大值即可
Code:
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#include<map>
#include<unordered_map>
#include<cstring>
using namespace std;
typedef long long LL;
/*
//O(n*log(n))
class Solution {
public:
int maxArea(vector<int>& height) {
int n=height.size(),Max=0;
vector<pair<int,int>> iv;
for(int i=0;i<n;++i)
iv.push_back({height[i],i});
sort(iv.begin(),iv.end());
int L=n,R=0;
for(int i=n-1;i>=0;--i)
{
L=min(L,iv[i].second);
R=max(R,iv[i].second);
Max=max(Max,iv[i].first*max(iv[i].second-L,R-iv[i].second));
}
return Max;
}
};
*/
//O(n)
class Solution {
public:
int maxArea(vector<int>& height) {
int l=0,r=height.size()-1,Max=0;
while(l<r){
Max=max(Max,min(height[l],height[r])*(r-l));
if(height[l]<height[r]) ++l;
else --r;
}
return Max;
}
};
int main()
{
int n,x;
vector<int> iv;
Solution So;
cin>>n;
for(int i=0;i<n;++i)
{
cin>>x;
iv.push_back(x);
}
cout<<So.maxArea(iv)<<endl;
return 0;
}