含水最多的容器(Container With Most Water)

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值