左老师容器接水

给定一个非负数的数组,代表一个容器请问可以接多少水,比如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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值