经典动态规划OJ题目:接雨水or接青豆(多种方法,附详详细思维过程、解析及源码)

news2024/11/15 16:58:16

作者:非妃是公主
专栏:《算法》《刷题笔记》
个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩

在这里插入图片描述

《算法》专栏系列文章

算法设计与分析复习01:主方法求递归算法时间复杂度

算法设计与分析复习02:分而治之算法

算法设计与分析复习03:动态规划算法
算法设计与分析复习04:贪心算法

算法设计与分析复习05:回溯及分支限界

算法设计与分析复习06:随机化算法

算法设计与分析复习07:样题

文章目录

  • 《算法》专栏系列文章
  • 题目:攒青豆
  • 分析
  • 源码
  • 存在问题
  • 正确思路
    • 算法思路
    • 数据结构
  • 正确源码

题目:攒青豆

现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
在这里插入图片描述

以下为上图例子的解析:
输入:height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。

分析

这道题是一道动态规划的题目,和leetcode经典题目接雨水本质是一样的。

结题的思路也是采用动态规划的思想,分为以下几种情况:

  • 从前往后遍历数组;
  • 如果当前高度高于上一个柱子高度,证明当前柱子的加入,可以继续加入豆子,导致最优解发生了变化,所以要更新前面柱子的高度。
    • 这时候,再一次进行遍历;
    • 寻找前面比当前柱子高的的柱子(可以把青豆挡住),找到后,更新寻找过程中遇到的柱子的高度较矮的柱子。
    • 如果一直找到了初始位置,也没有找到,则说明当前柱子是前面所有柱子中最高的的。这时候说明当前填充高度,为最高的柱子,取开始和当前位置的较低点。
  • 如果当前高度低于两边的高度,那么当前填充高度为左、右两个柱子中较短的高度。

源码

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

int main() {
	vector<int> hight, curHight;
	hight = { 5, 2, 7, 4, 9 };
	curHight = hight;

	for (int i = 1; i < hight.size(); i++) {
	
		if (hight[i] < hight[i - 1] && i + 1 < hight.size() && hight[i] < hight[i + 1]) {
			curHight[i] = min(hight[i - 1], hight[i + 1]);
		}

		else if (hight[i] > hight[i - 1]) {

			int j;
			for (j = i - 1; j >= 0; j--) {
				if (hight[i] <= hight[j]) {
					break;
				}
			}
			if (j == -1)j = 0;

			int newHight = min(hight[i], hight[j]);
			for (int k = j + 1; k < i; k++) {
				curHight[k] = newHight;
			}
		}		
	}

	int sum = 0;
	for (int i = 0; i < hight.size(); i++) {
		sum += curHight[i] - hight[i];
	}

	cout << sum;
}

存在问题

但是,注意上面标红的位置,这里是存在问题的!具体是什么问题呢?这种情况下求到的最低点不一定对于前面所有位置都是最低的。具体来看如下例子:

输入:[ 5, 2, 7, 4, 9]
分析:遍历到9的时候,由于9是最大的,因此会一直遍历到初始位置5,这时候程序认为从头到后最高的高度都是5,但是,比如倒数第二个位置,这里的填充高度应该是7,不是5,因此,就出现了错误。
输出:由于程序认为最后填充后的高度都是5,所以所以做差后求解结果为2

运行程序进行输出验证,结果如下:

在这里插入图片描述

正确思路

算法思路

正确思路十分简洁明了:

  1. 对于每一个位置,记录他左边最高的墙,记录他右边最高的墙。
  2. 二者取较小的就是能装的最高高度。
  3. 这两个数组的初始化通过两次遍历实现。(动态规划记录的过程,记录当前最大的)
  4. 最后求解的时候,遍历一遍实际的柱子,填充到左右两边较低柱子的高度。

数据结构

用两个数组来记录两边的墙,一个记录左边的墙,另一个记录右边的墙。

用1个数组来记录真实的柱子高度。

正确源码

int main() {	
	vector<int> hight;	// 每个位置墙的高度
	// 测试用例1
	hight = { 5,0,2,1,4,0,1,0,3 };
	// 测试用例2
	// hight = { 5, 2, 7, 4, 9 };
	// 当前位置两边最高的墙的高度
	vector<int> leftWall = vector<int>(hight.size(), 0); // 左边最高墙
	vector<int> rightWall = vector<int>(hight.size(), 0);// 右边最高墙

	// 初始化左边墙的高度
	int curMaxHight = hight[0];
	for (int i = 0; i < hight.size(); i++) {
		curMaxHight = max(curMaxHight, hight[i]);
		leftWall[i] = curMaxHight;
	}

	// 初始化右边墙的高度
	curMaxHight = hight[hight.size() - 1];
	for (int i = hight.size() - 1; i >= 0; i--) {
		curMaxHight = max(curMaxHight, hight[i]);
		rightWall[i] = curMaxHight;
	}

	// 得到当前位置可以填充的高度
	int sum = 0;
	for (int i = 0; i < hight.size(); i++) {
		int canFillHight = min(leftWall[i], rightWall[i]);
		sum += canFillHight - hight[i];
	}

	cout<<sum;	
}

在测试用例1下,输出如下:
在这里插入图片描述

测试用例2下,输出如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187874.html

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

相关文章

MySQL批量插入4种方案(对比速度起飞)

一、前言二、准备工作1、Maven项目中pom.xml文件引入的相关依赖如下2、application.yml配置属性文件内容&#xff08;重点&#xff1a;开启批处理模式&#xff09;3、Entity实体类&#xff08;测试&#xff09;4、数据库student表结构&#xff08;注意&#xff1a;无索引&#…

4.2 避免缩进错误

4.1.3 在for循环结束后执行一些操作for循环结束后再怎么做呢?通常,你需要提供总结性输出或接着执行程序必须完成的其他任务。在for循环后面&#xff0c;没有缩进的代码都只执行一次&#xff0c;而不会重复执行。下面来打印一条向全体魔术师致谢的消息&#xff0c;感谢他们的精…

爬虫实例(一) —— 5行 Python 代码爬取

大家好&#xff0c;我是 Enovo飞鱼&#xff0c;今天分享一个爬虫小案例&#xff0c;小白或者爬虫入门的小伙伴推荐阅读&#xff0c;加油&#x1f4aa;。 目录 前言 基本环境配置 爬取目标网站 爬取内容 实现代码 后面我会继续更新爬虫实例&#xff0c;与大家共同学习&am…

ubuntu设置双网卡以及多网段

前提设备有两个网卡&#xff0c;分别作为内网和外网,比如两个网卡eth0和eth1,eth0作为外网&#xff0c;eth1作为内网&#xff0c;每个人的网卡名称可能不一样&#xff0c;网卡名称可以自行查看&#xff0c;使用ifconfig命令&#xff1a;ifconfig区分内网和外网的ip外网网卡&…

如何使用 Apache IoTDB 中的 UDF

本篇作者&#xff1a;IoTDB 社区 -- 廖兰宇本文将概述用户使用 UDF 的大致流程&#xff0c;UDF 的详细使用说明请参考官网用户手册&#xff1a;https://iotdb.apache.org/zh/UserGuide/Master/Operators-Functions/User-Defined-Function.html1编写 UDFIoTDB 为用户提供编写 UD…

opensuse15.4安装android-studio-2021.1.1.23_未完成

opensuse15.4安装android_studio再运行微信apk_未完成 未完成的原因是&#xff1a;本人台式机的物理内存为4G&#xff0c;官方要求是16G android studio与android sdkj是两个完全不同的两样东西。 Android studio是一个IDE&#xff08;可视化开发工具&#xff09;跟eclipse一…

SAP 新准则IFRS 17:重新思考和革新保险会计的机会

您准备好迎接 IFRS 17 了吗&#xff1f;财务报告准则过去曾多次更改&#xff0c;但这次没有。这一变化将为准备迎接新准则的保险公司带来广泛的机遇。许多公司都有应对这些要求的战术计划。但最大的成功将由制定包括 IFRS 17 在内的更广泛报告战略的公司实现。他们不会做出回应…

redis-哈希槽一致hash算法

1、一致性hash算法&#xff1f; 以分布式缓存为例&#xff0c;假设现在有3台缓存服务器(S0&#xff0c;S1&#xff0c;S2)&#xff0c;要将一些图片尽可能平均地分配到不同的服务器上&#xff0c;hash算法的做法是&#xff1a; (1) 以图片的名称作为key&#xff0c;然后对其做…

【Unity3D插件】UniRx(基于Unity的响应式编程框架)插件教程

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群&#xff1a;1040082875 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、介绍UniRx插件 UniRx是一种基于Unity3D的…

九龙证券|石墨烯电池和锂离子电池哪个好

电池技术是电动汽车大力推广和开展的最大门槛&#xff0c;而电池工业正处于铅酸电池和传统锂电池开展均遇瓶颈的阶段&#xff0c;石墨烯储能设备的研制成功后&#xff0c;若能批量生产&#xff0c;则将为电池工业乃至电动车工业带来新的改造。那么石墨烯电池和锂离子电池哪个更…

VUE VS React 对比

VUE VS React 对比 这是面试中经常考察的一个问题&#xff0c;简单整理一下。我主要写 react &#xff0c;所以 react 的特点阐述的多一点。 语法格式 vue 是单独的文件格式&#xff0c;一个文件包括了 js css HTML 全部 React 通常是 jsx 格式&#xff0c;JS 和 HTML 写在…

shiro相关源码解析

1. 认证过程相关源码解析 前后文可接查看 shiro的登陆都是通过subject.login()方法实现&#xff0c;接下来我们就进入login方法查看实现过程&#xff1a; 1.1 进入DelegatingSubject类的login方法&#xff1a; 此类实现了Subject接口&#xff1a; public void login(Authen…

基于ssm的高校二手物品交易网 java idea mysql

本文论述了民办高校二手物品交易网的设计和实现&#xff0c;该网站从实际运用的角度出发&#xff0c;运用了计算机网站设计、数据库等相关知识&#xff0c;网络和Mysql数据库设计来实现的&#xff0c;网站主要包括用户注册、用户登录、浏览商品、搜索商品、查看商品并进行购买&…

bilibili全链路压测改造之全链自动化测试实践

01 、背景与意义 B站直播营收送礼业务有着高写、在跨晚和S赛等大型活动下流量陡增、数据实时性要求高等特性&#xff0c;传统压测对于写场景为了避免影响线上数据做了各种屏蔽和黑名单处理&#xff0c;有着无法逼近线上真实情况的问题&#xff0c;因此业务对全链路压测有着较大…

拿下阿里自动化测试岗23k*14薪offer的全程面试记录解析以及总结,一面二面三面,项目,功能,自动化,性能测试,面试题问答

一、自我介绍 面试官您好&#xff01;我叫xx&#xff0c;来自深圳&#xff0c;毕业之后一直从事于软件测试的工作&#xff0c;有做过保险、金融、电商等项目&#xff1b;有做过做功能测试、接口测试&#xff0c;自动化测试&#xff0c;在工作中积极主动、可以独立的完成测试工…

shiro(一):shiro基本概念及基本使用(认证、授权)

1. 权限的管理 1.1 什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理&#xff0c;权限管理属于系统安全的范畴&#xff0c;权限管理实现对用户访问系统的控制&#xff0c;按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 权限管理包括用…

算法刷题打卡第76天:判断矩阵是否是一个 X 矩阵

判断矩阵是否是一个 X 矩阵 难度&#xff1a;简单 如果一个正方形矩阵满足下述 全部 条件&#xff0c;则称之为一个 X 矩阵 &#xff1a; 矩阵对角线上的所有元素都 不是 0 矩阵中所有其他元素都是 0 给你一个大小为 n x n 的二维整数数组 grid &#xff0c;表示一个正方形矩…

CV——day72:从零开始学YOLO——YOLO-v3(可以在我的资源里下载完整的v1到v3的笔记啦!)

YOLO-v36. YOLO-v36.1 YOLO-v3 改进综述6.2 多scale方法改进与特征融合6.3 经典变换方法对比分析6.4 残差连接方法解读6.5 整体网络模型架构分析6.6 先验框设计改进6.7 softmax层改进6. YOLO-v3 **tips&#xff1a;**作者本人因为美军广泛运用于军事领域&#xff0c;所以决定不…

基于php电影点播平台/电影网站

摘要网络技术给生活带来了十分的便利。所以把电影点播平台与现在网络相结合。在点播平台发展的整个过程中&#xff0c;电影信息管理担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类电影信息管理程序也在不断改进。本课题所设计的电影点播平台&#xff0c;使…

张艺谋《满江红》起诉自媒体人,杨语莲推荐周兆成意在下个谋女郎

伴随着兔年春节的到来&#xff0c;又迎来一波贺岁剧热潮&#xff0c;著名导演张艺谋的《满江红》&#xff0c;也如期和观众朋友见面。随着春节的逐渐结束&#xff0c;贺岁电影《满江红》票房&#xff0c;也再次创下了新高&#xff0c;关于这部电影的话题也多了起来。 最引人关注…