42.接雨水

2024-05-27 21:44
文章标签 42 雨水

本文主要是介绍42.接雨水,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

·题目描述

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

示例 2:

输入:height = [4,2,0,3,2,5]
输出:9

·解题思路

————————暴力求解(最直接的想法)——————

利用指针遍历,left和right两个指针left从0到n-2,right 在left右边。当right移动遇见元素大于或者等于原始left元素的时候,说明形成凹陷,可以载雨水。

这个的问题在于,当最初始的left为最大元素,而right到达边界也不能大于或等于原始left元素,但是载该内部有小凹陷可以存在雨水,也就是需要对于边界条件进行处理。

解决办法,引入了有边界寻找的条件判断。当可以寻找到右边界,那么就是简单处理。如果寻找不到右边界,寻找从边界条件处left往后的最大元素(不包括left),将最大元素作为right边界计算凹形面积。再left = right 迭代。

为什么要用最大元素作为边界条件呢?这是以为从右边界往前,最大元素会阻挡凹陷。

·代码java

class Solution {public int trap(int[] height) {int n = height.length;int left = 0;int area = 0;while(left < n - 1){if(height[left] < height[left + 1]){left ++;continue;}int count = 0;int right = left + 1;boolean fond = false;while(right < n){if(height[right] >= height[left]){fond = true;break;}count += height[right];right ++;}if(fond){int H = Math.min(height[left], height[right]);int W = right - left - 1;area += H * W - count;left = right ;}else {int MaxIndex = left + 1;for(int i = left + 1; i < n; i++) {if (height[i] > height[MaxIndex]) {MaxIndex = i;}}right = MaxIndex;count = 0;for(int j = left + 1; j < right; j++){count += height[j];}int H = Math.min(height[left], height[right]);int W = right - left - 1;area += H * W - count;left = right ;}}return area;}
}

——————官方的动态规划——————

动态规划的原理在于:从左往右将小元素置为左边最大的元素;再从右往左,将小元素置为右边最大的元素。两次扫描的重叠区域再减去原有的数组就是可以盛水的区域。

·代码:

    public int trap(int[] height) {int n = height.length;int area = 0;int[] leftMax = new int[n], rightMax = new int[n];leftMax[0] = height[0];rightMax[n - 1] = height[n - 1];for(int i = 1; i < n ; i ++){leftMax[i] = Math.max(leftMax[i - 1], height[i]);}for(int i = n - 2 ; i >= 0; i --){rightMax[i] = Math.max(rightMax[i + 1], height[i]);}for(int i = 0 ; i < n ; i ++){area += Math.min(leftMax[i], rightMax[i]) - height[i];}return area;}

————————将两个数组该为双指针问题——————

从上述动态规划的算法中可以发现,最后的area叠加

area += Math.min(leftMax[i], rightMax[i]) - height[i];

那么可以利用双指针将min计算步骤改为

(height[left] < height[right])

所以最后代码:

    public int trap(int[] height) {int n = height.length;int area = 0;int left =0, right = n - 1;int leftMax = 0, rightMax = 0;while (left < right) {leftMax = Math.max(leftMax, height[left]);rightMax = Math.max(rightMax, height[right]);if (height[left] < height[right]) {area += leftMax - height[left];left++;} else {area += rightMax - height[right];right--;}}return area;}

这篇关于42.接雨水的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1008674

相关文章

力扣接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 示例 2: 输入:height

数据库系统 第42节 数据库索引简介

数据库索引是数据库表中一个或多个列的数据结构,用于加快数据检索速度。除了基础的B-Tree索引,其他类型的索引针对特定的数据类型和查询模式提供了优化。以下是几种不同类型的索引及其使用场景的详细说明和示例代码。 1. 位图索引 (Bitmap Index) 位图索引适用于具有少量不同值的列(例如性别、国家代码等),它使用位图来表示数据,从而提高查询效率。 适用场景:当列中的值域较小,且数据分布

【代码随想录训练营第42期 续Day52打卡 - 图论Part3 - 卡码网 103. 水流问题 104. 建造最大岛屿

目录 一、做题心得 二、题目与题解 题目一:卡码网 103. 水流问题 题目链接 题解:DFS 题目二:卡码网 104. 建造最大岛屿 题目链接 题解:DFS  三、小结 一、做题心得 也是成功补上昨天的打卡了。 这里继续图论章节,还是选择使用 DFS 来解决这类搜索问题(单纯因为我更熟悉 DFS 一点),今天补卡的是水流问题和岛屿问题。个人感觉这一章节题对于刚

LeetCode - 42. Trapping Rain Water

42. Trapping Rain Water  Problem's Link  ---------------------------------------------------------------------------- Mean:  在坐标上给你一些竖直放置的条形积木,问你这个积木能够容纳多少液体. analyse: 首先找出最高的积木,然后从前往后一直

leetcode解题思路分析(六)37-42题

解数独 编写一个程序,通过已填充的空格来解决数独问题。 本题主要是采取回溯法解决,选择最少空位的行、列、块,然后进行填入,如果出现问题则回溯 class Solution {public:// line, column, block 分别存储每行、每列、每宫中可用的数字vector<set<int>> line, column, block;//哈希更新每行/列/宫中可以使用的数字void

【代码随想录训练营第42期 Day50打卡 - dfs入门 - 卡码网 98. 所有可达路径

目录 一、dfs基础 二、模板题 题目:98. 所有可达路径 题目链接 题解:dfs+邻接矩阵  三、小结 一、dfs基础 dfs是按照一个方向搜索到尽头再搜索其他方向。怎样实现对其他方向的搜索呢?我们可以通过回溯,撤销最后一步,再选择其他路线。 -- 回溯过程某种程度上也是递归的体现。所以,实现 dfs 的一个关键就是递归。 之前有了回溯的基础,其实可以发现回溯算法

力扣面试经典算法150题:接雨水

接雨水 今天的题目是力扣面试经典算法150题中的困难难度数组题目:分发糖果。 题目链接:https://leetcode.cn/problems/trapping-rain-water/description/?envType=study-plan-v2&envId=top-interview-150 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱

牛客笔试,牛客.四个选项(dfs巨难)牛客.接雨水动态规划单调栈解法牛客.栈和排序牛客.加减

目录 牛客.四个选项(dfs巨难) 牛客.接雨水 动态规划 单调栈解法 牛客.栈和排序 牛客.加减 牛客.四个选项(dfs巨难)   刚开始我是想着用数学,Cxx去解决,但是他的还有其余条件,就没有办法解决,所以就枚举 ,递归的数据量不大时候,是推荐使用的 import java.util.*;// 注意类名必须为 Main, 不要有任何 packag

42. 连续子数组的最大和

comments: true difficulty: 简单 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9842.%20%E8%BF%9E%E7%BB%AD%E5%AD%90%E6%95%B0%E7%BB%84%E7%9A%84%E6%9C%80%E5%A4%A7%E5%

[Algorithm][综合训练][四个选项][接雨水]详细讲解

目录 1.四个选项1.题目链接2.算法原理详解 && 代码实现 2.接雨水1.题目链接2.算法原理详解 && 代码实现 1.四个选项 1.题目链接 四个选项 2.算法原理详解 && 代码实现 解法:DFS(暴搜) + 剪枝 + Hash 剪枝: 填某个数的时候,要看看还有没有剩余次数填某个数的时候,符不符合若干题的选项必须相同 #include <iostr