【力扣】盛最多水的容器

news/2024/10/17 21:22:18/

目录

题目

题目初步解析

水桶效应

代码实现逻辑

第一步

第二步

第三步

代码具体实现

注意

添加容器元素的函数

计算迭代并且判断面积是否是最大值

总代码

运行结果

总结


题目

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

题目初步解析

这一道题就是我们小时候常常说的水桶效应

水桶效应

水桶效应是指一只水桶想盛满水,必须每块木板都一样平齐且无破损,如果这只桶的木板中有一块不齐或者某块木板下面有破洞,这只桶就无法盛满水。是说一只水桶能盛多少水,并不取决于最长的那块木板,而是取决于最短的那块木板。也可称为短板效应。一个水桶无论有多高,它盛水的高度取决于其中最低的那块木板。

这就是我们要利用的思想来解答题目

代码实现逻辑

这是一个运用到双指针思想的问题(不一定用指针)

第一步

可以在数组的两侧(开头以及末尾)标记两个指针(或者记录下标)

然后计算面积

第二步

此时当然不能说这是最大的面积

我们要进行遍历

那怎么遍历呢?

还记得我们刚刚说的木头效应吗?

你装下的水取决于的是你最小的那一块木板

那如果要遍历的话

只能是短的一边进行更新,如果是左边的指针那就往右移动

如果是右边的就往左边进行移动

也就是都向“中间”更新

因为在横坐标两条垂线的距离降低的情况下,如果变化的是长边,盛水的长方形的高依旧不会变,不需要比较,那么面积必然会更小

第三步

那迭代出来的面积个数不止一个,怎么办呢?

分别比大小就可以了

第三步的步骤就是把每次迭代出来的值与之前的最大值比大小

如果更新的值更大,那就更新最大值就行

代码具体实现

注意

这里是展示所有代码可直接运行,但是力扣上的一个类,所以要改一下才可以跑

添加容器元素的函数

void addCounts(vector<int>& sum_1)
{int length;cout << "输入数组的长度" << endl;cin >> length;int i = 1;while (i <= length){int sum_2;cout << "输入第" << i << "个元素" << endl;cin >> sum_2;sum_1.insert(sum_1.end(), sum_2);i++;};
}

 这里就是最基本的赋值就行

可以用链表的形式,当然我图方便用了容器

不过如果用链表的话那下面的函数要进行修改

这些方法都可以

计算迭代并且判断面积是否是最大值

int maxArea(vector<int> height) 
{int maxarea = 0;int maxarea_1 = 0;int i = 0;int j = height.size() - 1;//最左节点int left_str = height[i];//最右节点int right_str = height[j];while (i != j){if (height[i] < height[j]){maxarea_1 = height[i] * (j - i);if (maxarea < maxarea_1)maxarea = maxarea_1;i++;}else{maxarea_1 = height[j] * (j - i);if (maxarea < maxarea_1)maxarea = maxarea_1;j--;}}return maxarea;
}

我这里是用下标进行定位的

计算面积同时判断大小

while语句中判断左边标记的下标等于右边的时候跳出循环

需要注意的是迭代的时候左边是++右边是--

总代码

总代码附上

#include <iostream>
#include <vector>
using namespace std;
//添加数组元素
void addCounts(vector<int>& sum_1)
{int length;cout << "输入数组的长度" << endl;cin >> length;int i = 1;while (i <= length){int sum_2;cout << "输入第" << i << "个元素" << endl;cin >> sum_2;sum_1.insert(sum_1.end(), sum_2);i++;};
}
int maxArea(vector<int> height) 
{int maxarea = 0;int maxarea_1 = 0;int i = 0;int j = height.size() - 1;//最左节点int left_str = height[i];//最右节点int right_str = height[j];while (i != j){if (height[i] < height[j]){maxarea_1 = height[i] * (j - i);if (maxarea < maxarea_1)maxarea = maxarea_1;i++;}else{maxarea_1 = height[j] * (j - i);if (maxarea < maxarea_1)maxarea = maxarea_1;j--;}}return maxarea;
}
int main()
{vector<int> sum_1;addCounts(sum_1);int maxarea = maxArea(sum_1);cout << "*************************************************************************"<< endl;cout <<"面积为" << maxarea << endl;return 0;
}

运行结果

和题目得到示例得到的结果一样

总结

本次博客学习了一种新的思想,并且巧妙的运用了学到的木桶效应来进行解题


http://www.ppmy.cn/news/1063096.html

相关文章

4.16 TCP 协议有什么缺陷?

目录 升级 TCP 的工作很困难 TCP 建立连接的延迟 TCP 存在队头阻塞问题 网络迁移需要重新建立 TCP 连接 升级 TCP 的工作很困难&#xff1b;TCP 建立连接的延迟&#xff1b;TCP 存在队头阻塞问题&#xff1b;网络迁移需要重新建立 TCP 连接&#xff1b; 升级 TCP 的工作很…

adb使用总结

adb连接到模拟器 adb devices 打开模拟器&#xff0c;找到设置。 多次点击版本号&#xff0c;切换到开发者模式 搜索进入开发者选项 开启USB调试 此时在终端输入adb devices就连接上了 使用adb查看安卓手机架构 adb shell getprop ro.product.cpu.abi 进入安卓手机的shell …

五、多表查询-3.4连接查询-联合查询union

一、概述 二、演示 【例】将薪资低于5000的员工&#xff0c;和 年龄大于50岁的 员工全部查询出来 1、查询薪资低于5000的员工 2、查询年龄大于50岁的员工 3、将薪资低于5000的员工&#xff0c;和 年龄大于50岁的 员工全部查询出来&#xff08;把上面两部分的结果集直接合并起…

二叉树的层序遍历及完全二叉树的判断

文章目录 1.二叉树层序遍历 2.完全二叉树的判断 文章内容 1.二叉树层序遍历 二叉树的层序遍历需要一个队列来帮助实现。 我们在队列中存储的是节点的地址&#xff0c;所以我们要对队列结构体的数据域重定义&#xff0c; 以上代码 从逻辑上来讲就是1入队&#xff0c;1出队&am…

记录帖子-开发过程中遇到的问题和感悟记录

记录帖子1:2023年08月25日结束开发 前端规范 1.关于计算属性 计算属性关联的变量不可以过多&#xff0c;同时要保证关联的变量在代码中的变换次数不可过多 例如这段代码的this.options内部数据变化过多&#xff0c;导致计算属性调用次数过多导致页面卡顿 2.关于自定义v-mod…

每日一学——二层交换机

以下是一个简单的二层交换机配置案例&#xff0c;供您参考&#xff1a; 首先&#xff0c;连接您的电脑或终端设备到交换机上的任意一个端口&#xff0c;确保连接正常。 进入交换机的管理界面&#xff0c;一般可以通过浏览器访问交换机的 IP 地址来登录。 在管理界面上&#x…

智慧课堂学生行为检测评估算法

智慧课堂学生行为检测评估算法通过yolov5系列图像识别和行为分析&#xff0c;智慧课堂学生行为检测评估算法评估学生的表情、是否交头接耳行为、课堂参与度以及互动质量&#xff0c;并提供相应的反馈和建议。智慧课堂学生行为检测评估算法能够实时监测学生的上课行为&#xff0…

15.live555mediaserver-rtp打包

live555工程代码路径 live555工程在我的gitee下&#xff08;doc下有思维导图、drawio图&#xff09;&#xff1a; live555 https://gitee.com/lure_ai/live555/tree/master 章节目录链接 0.前言——章节目录链接与为何要写这个&#xff1f; https://blog.csdn.net/yhb1206/art…