【力扣】盛最多水的容器

news2024/11/10 16:12:26

目录

题目

题目初步解析

水桶效应

代码实现逻辑

第一步

第二步

第三步

代码具体实现

注意

添加容器元素的函数

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

总代码

运行结果

总结


题目

给定一个长度为 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.coloradmin.cn/o/932532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GB28181学习(一)——总述

概念 GB28181全称是“公共安全视频监控联网系统信息传输、交换、控制技术要求”&#xff0c;它定义了视频监控设备之间的联网通信协议&#xff0c;旨在实现视频监控系统的互联互通和统一管理。 架构 GB28181协议的基本架构包括设备端和平台端。 设备端&#xff1a;包括视频监…

广告行业小程序搭建教程,零基础也能轻松上手

随着移动互联网的发展和智能手机的普及&#xff0c;小程序成为了各行业推广和服务的利器。对于广告行业来说&#xff0c;拥有一个专属的小程序不仅能提升企业形象&#xff0c;还可以方便用户查看广告、咨询服务等。那么&#xff0c;如何简单操作一键搭建广告行业小程序呢&#…

小区物业业主管理信息系统设计的设计与实现(论文+源码)_kaic

摘 要 随着互联网的发展&#xff0c;网络技术的发展变得极其重要&#xff0c;所以依靠计算机处理业务成为了一种社会普遍的现状。管理方式也自然而然的向着现代化技术方向而改变&#xff0c;所以纯人工管理方式在越来越完善的现代化管理技术的比较之下也就显得过于繁琐&#x…

SpringCloud超详细教程

1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff1a;将业务的所有…

WEBRTC 的RTP/RTCP的 NACK, PLI,SLI,FIR

1&#xff0c;概述 在网络环境不是太好的情况下&#xff0c;比如网络拥塞比较严重&#xff0c;丢包率可能比较高&#xff0c;简单实用NACK重传的机制&#xff0c;这样就会有大量的RTCP NACK报文&#xff0c;发送端收到相应的报文&#xff0c;又会发送大量指定的RTP报文&#xf…

认识Mybatis的关联关系映射,灵活关联表对象之间的关系

目录 一、概述 ( 1 ) 介绍 ( 2 ) 关联关系映射 ( 3 ) 关联讲述 二、一对一关联映射 2.1 数据库创建 2.2 配置文件 2.3 代码生成 2.4 编写测试 三、一对多关联映射 四 、多对多关联映射 给我们带来的收获 一、概述 ( 1 ) 介绍 关联关系映射是指在数据库中&…

Premiere Pro软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Adobe Premiere Pro&#xff0c;简称PR&#xff0c;是Adobe公司开发的一款非线性视频编辑软件&#xff0c;被广泛应用于电影、电视剧、广告、纪录片、独立电影和音乐会等影视制作领域。它被公认为是行业内的标准工具&#xff0c…

陶哲轩6000字详述:计算机辅助数学证明的历史

导读 几个世纪以来&#xff0c;计算机&#xff08;机器&#xff09;一直是数学家的好朋友&#xff0c;他们利用它计算、提出猜想以及进行数学证明。随着交互式定理证明器、机器学习算法和生成式AI等更为先进的工具的出现&#xff0c;机器被更具创新性和深度的方式得到运用。 近…

深度学习3. 强化学习-Reinforcement learning | RL

强化学习是机器学习的一种学习方式&#xff0c;它跟监督学习、无监督学习是对应的。本文将详细介绍强化学习的基本概念、应用场景和主流的强化学习算法及分类。 目录 什么是强化学习&#xff1f; 强化学习的应用场景 强化学习的主流算法 强化学习(reinforcement learning) …

yum命令安装程序

Ubuntu图系统的安装命令&#xff1a; top命令&#xff1a; df -h查看磁盘占用信息 网络状态监控 环境变量和&#xffe5;符号的用法&#xff1a; 上传下载命令&#xff1a; 压缩解压常见&#xff1a;的压缩格式 tar tar解压&#xff1a;

汤普森采样(Thompson sampling)理论支持

目录 一、UCB与TS算法数学原理&#xff08;1&#xff09;Upper Confidence Bounds 数学原理&#xff08;2&#xff09;Thompson sampling 数学原理1、TS 基本数据原理1. beta 分布2. 共轭分布与共轭先验3. 采样的编程实现 2、TS 算法流程(1) TS算法基础版本 二、UCB与TS算法的优…

深度学习2.神经网络、机器学习、人工智能

目录 深度学习、神经网络、机器学习、人工智能的关系 大白话解释深度学习 传统机器学习 VS 深度学习 深度学习的优缺点 4种典型的深度学习算法 卷积神经网络 – CNN 循环神经网络 – RNN 生成对抗网络 – GANs 深度强化学习 – RL 总结 深度学习 深度学习、神经网络…

ModaHub魔搭社区:WinPin经营大脑助手

产品介绍 智慧经营助手:企业专属的“数据工程师”“BI分析师” WinPlan决策系统 算力 阿里云 腾讯云 AWS亚马逊 框架 业务数据基座 WinPlan垂直大模型 模型 分析模型 预测模型 决策模型 应用 精准预测

微信视频号下载,个人在用的好使工具,就一个可执行文件,打开直接用

比其它一些工具好使&#xff0c;目前个人在用的好使工具&#xff0c;就一个可执行文件&#xff0c;打开直接用&#xff1a; 先监听&#xff08;安装一下证书&#xff09;&#xff08;图1&#xff09;打开视频号左侧选择地址&#xff0c;点“复制链接”&#xff08;图2&#xf…

二叉树链式结构的实现

文章目录 1.前置说明 2.二叉树的遍历 文章内容 1.前置说明 学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能学习其相关的基本操作。由于现在我们对于二叉树的了解还处于初级阶段&#xff0c;所以我们手动创建一棵简单的二叉树&#xff0c;以便…

文本编辑器Vim常用操作和技巧

文章目录 1. Vim常用操作1.1 Vim简介1.2 Vim工作模式1.3 插入命令1.4 定位命令1.5 删除命令1.6 复制和剪切命令1.7 替换和取消命令1.8 搜索和搜索替换命令1.9 保存和退出命令 2. Vim使用技巧 1. Vim常用操作 1.1 Vim简介 Vim是一个功能强大的全屏幕文本编辑器&#xff0c;是L…

Java—实现多线程程序 | 入门

目录 一、前言 二、基本概念 进程 线程 三、Java多线程实现 java.lang.Thread类 获取线程名字及对象 获取main进程名 Thread currentThread() 四、线程优先级 设置优先级 一、前言 前期入门学习的代码中&#xff0c;全部都是单线的程序&#xff0c;也就是从头到尾…

Windows商店引入SUSE Linux Enterprise Server和openSUSE Leap

在上个月的Build 2017开发者大会上&#xff0c;微软宣布将SUSE&#xff0c;Ubuntu和Fedora引入Windows 商店&#xff0c;反应出微软对开放源码社区的更多承诺。 该公司去年以铂金会员身份加入Linux基金会。现在&#xff0c;微软针对内测者的Windows商店已经开始提供 部分Linux发…

JavaScript——为什么静态方法不能调用非静态方法

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

C++中的const成员变量和成员函数

在类中&#xff0c;如果你不希望某些数据被修改&#xff0c;可以使用const关键字加以限定。const 可以用来修饰成员变量和成员函数。 const成员变量 const 成员变量的用法和普通 const 变量的用法相似&#xff0c;只需要在声明时加上 const 关键字。初始化 const 成员变量只有…