【科学刷题】接雨水:从1维到2维

2024-04-20 23:18
文章标签 科学 刷题 雨水 维到

本文主要是介绍【科学刷题】接雨水:从1维到2维,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1 【1维】接雨水
    • 1.1 DP 解法
    • 1.2 单调栈 解法
    • 1.3 堆 解法
  • 2【1维】 盛最多水的容器
  • 3【2维】接雨水

1 【1维】接雨水

42. 接雨水

1.1 DP 解法

时间复杂度: O ( N ) O(N) O(N)

  • Python
class Solution:def trap(self, height: List[int]) -> int:sum = 0n = len(height)max_left = [0] * nmax_right = [0] * nfor i in range(1, n - 1):max_left[i] = max(max_left[i - 1], height[i - 1])for i in reversed(range(1, n - 1)):  # range(n - 2, 0, -1):max_right[i] = max(max_right[i + 1], height[i + 1])for i in range(1, n - 1):min_height = min(max_left[i], max_right[i])sum += max(0, min_height - height[i])return sum
  • CPP
class Solution {
public:int trap(vector<int>& height) {int n=height.size();vector<int> left(n,0);vector<int> right(n,0);int ans=0;for(int i=1;i<n;++i){left[i]=max(left[i-1],height[i-1]);}for(int i=n-2;i>=0;--i){right[i]=max(right[i+1],height[i+1]);}for(int i=1;i<n-1;++i){ans+=max(0,min(left[i],right[i])-height[i]);}return ans;}
};

1.2 单调栈 解法

时间复杂度: O ( N ) O(N) O(N)

class Solution:def trap(self, height: List[int]) -> int:n = len(height)stack = []ans = 0#         □# □       □# □ □   □ □# 2 1 0 1 3#       ↑ ↑ 触发出栈情况# h:    1 1# l:    1 3# 出站后的pre变量代表了前一个高度for i in range(n):while stack and height[stack[-1]] < height[i]:pre = stack.pop()# 如果stack为空,表示 [2, 3, 4] 这种情况,围不起来if not stack:breakt = stack[-1]h = min(height[t], height[i]) - height[pre]  # 当前高度 - 上一个高度l = i - t - 1ans += h * lstack.append(i)return ans

1.3 堆 解法

时间复杂度: O ( N log ⁡ N ) O(N\log N) O(NlogN)

class Solution:def trap(self, height: List[int]) -> int:if not height:return 0n = len(height)vis = [0] * npq = []for i in (0, n - 1):vis[i] = Trueheapq.heappush(pq, (height[i], i))ans = 0while pq:wh, x = heapq.heappop(pq)for dx in [-1, 1]:cx = x + dxif not (0 <= cx < n):continueif vis[cx]:continuech = height[cx]ans += max(0, wh - ch)vis[cx] = Trueheapq.heappush(pq, (max(ch, wh), cx))return ans

2【1维】 盛最多水的容器

11. 盛最多水的容器

双指针:

class Solution:def maxArea(self, height: List[int]) -> int:l = 0n = len(height)r = n - 1ans = 0while l < r:ans = max((r - l) * min(height[l], height[r]), ans)if height[l] < height[r]:l += 1else:r -= 1return ans

3【2维】接雨水

407. 接雨水 II

时间复杂度: O ( N M log ⁡ ( N + M ) ) O(NM\log (N+M)) O(NMlog(N+M))

class Solution:def trapRainWater(self, heightMap: List[List[int]]) -> int:m, n = len(heightMap), len(heightMap[0])pq = []vis = [[0] * n for _ in range(m)]for i in range(m):for j in range(n):if i in (0, m - 1) or j in (0, n - 1):heapq.heappush(pq, (heightMap[i][j], i, j))vis[i][j] = 1dirs = [-1, 0, 1, 0, -1]ans = 0while pq:wh, x, y = heapq.heappop(pq)for k in range(4):nx, ny = x + dirs[k], y + dirs[k + 1]if 0 <= nx < m and 0 <= ny < n and vis[nx][ny] == 0:ch = heightMap[nx][ny]ans += max(0, wh - ch)vis[nx][ny] = 1heapq.heappush(pq, (max(wh, ch), nx, ny))return ans

这篇关于【科学刷题】接雨水:从1维到2维的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

【每日刷题】Day113

【每日刷题】Day113 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 91. 解码方法 - 力扣(LeetCode) 2. LCR 098. 不同路径 - 力扣(LeetCode) 3. 63. 不同路径 II - 力扣(LeetCode) 1. 91. 解码方法 - 力扣(LeetCode) //思路:动态规划。 cl

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II 1.题目 1.1递增子序列 题目链接:491. 非递减子序列 - 力扣(LeetCode) 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0491.%E9%80%92%E

GraphPad Prism 10 for Mac/Win:高效统计分析与精美绘图的科学利器

GraphPad Prism 10 是一款专为科研工作者设计的强大统计分析与绘图软件,无论是Mac还是Windows用户,都能享受到其带来的便捷与高效。该软件广泛应用于生物医学研究、实验设计和数据分析领域,以其直观的操作界面、丰富的统计方法和多样化的图表样式,成为科学研究的得力助手。 数据处理与整理 GraphPad Prism 10 支持从多种数据源导入数据,如Excel、CSV文件及数据库

力扣接雨水

给定 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

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II 1.题目 1.1复原IP地址 题目链接:93. 复原 IP 地址 - 力扣(LeetCode) 视频讲解:回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0093.%E5%A4%8

【笔记】数据结构刷题09

快速排序 215. 数组中的第K个最大元素 class Solution {public:int findKthLargest(vector<int>& nums, int k) {return divide(nums,0,nums.size()-1,nums.size()-k);}int divide(vector<int>& nums,int left,int right,int k)

C语言:刷题日志(1)

一.阶乘计算升级版 本题要求实现一个打印非负整数阶乘的函数。 其中n是用户传入的参数,其值不超过1000。如果n是非负整数,则该函数必须在一行中打印出n!的值,否则打印“Invalid input”。 首先,知道阶乘是所有小于及等于该数的正整数的积,并且0的阶乘为1。那么我们先来个简单的阶乘计算吧。 #include<stdio.h>int Fact(int n){if (n <=

【每日刷题】Day112

【每日刷题】Day112 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 1137. 第 N 个泰波那契数 - 力扣(LeetCode) 2. 面试题 08.01. 三步问题 - 力扣(LeetCode) 3. LCR 088. 使用最小花费爬楼梯 - 力扣(LeetCode) 1. 1137. 第 N 个泰波那契数 - 力扣(LeetCo

【数据结构】【java】leetcode刷题记录--链表

简介 链表是一种常见的基础数据结构,它由一系列节点组成,每个节点包含数据域和指向下一个节点的指针。在Java中,链表通常用于实现动态数据结构,因为它可以根据需要动态地增加或减少节点。 链表简介: 节点结构:链表中的每个元素称为节点(Node),每个节点包含两部分:数据域(存储数据)和指针域(存储下一个节点的地址)动态性:链表的长度不是固定的,可以根据需要动态地增减节点。内存分配:链表中的节点