持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
一、题目
描述:
给定一个数组height,长度为n,每个数代表坐标轴中的一个点的高度,height[i]是在第i点的高度,请问,从中选2个高度与x轴组成的容器最多能容纳多少水
1.你不能倾斜容器
2.当n小于2时,视为不能形成容器,请返回0
3.数据保证能容纳最多的水不会超过整形范围
#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,7,3,2,4,5,8,2,7 面积=1*8=8,排除1
- 7,3,2,4,5,8,2,7 面积=7*7=49,排除7
- 3,2,4,5,8,2,7 面积=3*6=24,排除3
- 2,4,5,8,2,7 面积=2*5=10,排除2
- 4,5,8,2,7 面积=4*4=16,排除4
- 5,8,2,7 面积=5*3=15,排除5
- 8,2,7 面积=7*2=14,排除7
- 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;
}
五、结言
最大容器问题也是动态规划问题的一种,通过对子问题的划分,不断求最优解以致求得全局最优解。
创作不易,留个赞再走吧!如果对文章内容有任何指正,欢迎评论!