每日一算法题-盛水最多的容器

87 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情

一、题目

描述:
给定一个数组height,长度为n,每个数代表坐标轴中的一个点的高度,height[i]是在第i点的高度,请问,从中选2个高度与x轴组成的容器最多能容纳多少水
1.你不能倾斜容器
2.当n小于2时,视为不能形成容器,请返回0
3.数据保证能容纳最多的水不会超过整形范围

image.png

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int area(vector<int>& water)
{
}

int main(int, char*[])
{
    vector<int> water = {1,7,3,2,4,5,8,2,7};
    cout << area(water) << endl;
}

二、分析

由题意可知,要获取盛水最多的容器,就是求体积最大,体积由两条边长决定。
现在每条竖边的长度是不确定的,底边的长度由两条竖边的距离所决定的,距离越远,底边越长。
两条竖边所能决定体积的是最短的那条,体积就等于短竖边乘以距离。
在遍历推进的时候,要保证推进之后体积的最大化,就要积极排除短竖边,每次都取长的一边,就能保证每次推进,排除的都是小体积。

三、模拟

  1. 1,7,3,2,4,5,8,2,7 面积=1*8=8,排除1
  2. 7,3,2,4,5,8,2,7 面积=7*7=49,排除7
  3. 3,2,4,5,8,2,7 面积=3*6=24,排除3
  4. 2,4,5,8,2,7 面积=2*5=10,排除2
  5. 4,5,8,2,7 面积=4*4=16,排除4
  6. 5,8,2,7 面积=5*3=15,排除5
  7. 8,2,7 面积=7*2=14,排除7
  8. 8,2 面积=2*1=2

四、实现

int area(vector<int>& water)
{
    int result = 0;
    int start = 0, end = water.size() - 1;
    while(start < end){
        int temp = min(water.at(start), water.at(end)) * (end - start);
        if(temp > result){
            result = temp;
        }
        if(water.at(start) < water.at(end)){
            ++start;
        }else{
            --end;
        }
    }
    return result;
}

五、结言

最大容器问题也是动态规划问题的一种,通过对子问题的划分,不断求最优解以致求得全局最优解。

创作不易,留个赞再走吧!如果对文章内容有任何指正,欢迎评论!