给定一个非负数的数组,代表一个容器请问可以接多少水,比如10 5 20 可以接10-5=5的水时间复杂度O(N)额外空间复杂度O(1);
1、对于I未知遍历最左边最大值,最右边最大值,可以求得i位置的水量,可以准备两个数组L[i]表示i位置左边最大值,R[I]表示i位置右边最大值O(N)
2、可以用一个左边最大值max代替L[I]这个数组O(N)
3、不用数组,只用两个左右指针谁小谁动
#include<iostream>
#include<string>
#include <vector>
#include<algorithm>
using namespace std;
//最长递增子序列长度
int getwarter1(int *arr,int len)
{
if(arr==NULL||len<3)
return 0;
int n=len-2;
int k1=0,k2=len-1;
int rightmax[100]={0};
for(int i=len-2;i>=1;i--)
{
rightmax[i]=max(rightmax[i+1],arr[i+1]);
}
int value=0;
int leftmax=arr[0];
for(int i=1;i<=len-2;i++)
{
value+=max(0,min(leftmax-arr[i],rightmax[i]-arr[i]));
leftmax=max(leftmax,arr[i]);
}
return value;
}
int getwarter2(int *arr,int len)
{
if(arr==NULL||len<3)
return 0;
int value =0;
int leftmax=arr[0];
int rightmax=arr[len-1];
int l=1;
int r=len-2;
while(l<=r)
{
if(leftmax<=rightmax)
{
value+=max(0,leftmax-arr[l]);
leftmax=max(leftmax,arr[l]);
l++;
}
else
{
value+=max(0,rightmax-arr[r]);
rightmax=max(rightmax,arr[r]);
r--;
}
}
return value;
}
int main()
{
int len;
cin>>len;
int arr[100];
for(int i=0;i<len;i++)
cin>>arr[i];
cout<<getwarter2(arr, len)<<endl;
return 0;
}