https://leetcode.com/problems/container-with-most-water/description/
题目大意:给n个数,a1,a2....ai....an,每个数对应一个坐标(i,ai),对每个坐标与(i,0)做线段,这n个线段哪两个线段与x轴构成的容器装水最多?
思路:容器容量由两个线段最短的长度,和底决定。
简单暴力:就是算出两两线段组成的容器大小,这样需要计算(n-1)+(n-2)+(n-3).....次,没那么简单,得优化
事实上,算出最两端的那个容器,然后两端向内移动,其中向内移动过程中,遇到比(两端线段中最短的那个线段)还要短或一样短的肯定不用考虑。这样做法也不会丢失任何情况。
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<limits.h>
#include<vector>
using namespace std;
int maxArea(vector<int>& height){
int max_w=0;
int i=0,j=height.size()-1;
int min_h;
while(i<j){
//对目前容器两端找最短的一端min_h
min_h=min(height[i],height[j]);
max_w=max(max_w,min_h*(j-i));
//从左端开始,比min_h还小或相等的肯定没可能,因为底长已经变短了
while(min_h>=height[i]&&i<j)
i++;
while(min_h>=height[j]&&i<j)
j--;
}
return max_w;
}
int main(){
vector<int> a;
int n,b;
cin >> n;
for(int i=0;i<n;i++)
{
cin >> b;
a.push_back(b);
}
printf("%d",maxArea(a));
return 0;
}