IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> golang力扣leetcode 42.接雨水 -> 正文阅读

[数据结构与算法]golang力扣leetcode 42.接雨水

42.接雨水

42.接雨水

题解

题目:一定一个数组,代码下标位置的高度,求最大接雨水量

思路:

暴力 O(n^2)

1.在当前位置,向左找最大高度,向右找最大高度,取两者较小的
2.用最大高度的较小值 ,减去当前位置的高度,即接雨水量

动态规划O(n)

1.在暴力解法中,每到一个新位置,都要重新查找一遍左右最大值
2.我们可以提前将每个位置的左右最大值找出来
3.找出来后一次遍历即可计算答案
4.从后往前遍历一次,记录左边最大值
5.从前往后遍历一次,记录右边最大值

在这里插入图片描述

单调栈

1.遍历数组的时候维护一个栈
2.如果当前高度小于等于栈顶,则入栈(意味着当前位置的雨水,被栈顶限制)
3.如果当前高度大于栈顶,则计算栈顶的积水量(当前与栈顶的前一个限定了栈顶的积水量),并弹出栈顶

双指针

1.左右指针指向最左边和最右边
2.如果height[l] < height[r],则积水量是依赖于height[l]3.如果height[l] > height[r],则积水量是依赖于height[r]4.假设现在是依赖于height[l]
5.如果height[l]>left_max,说明没有积水,更新left_max
6.如果height[l]<left_max,说明有积水,计算积水量,并且记得移动指针

代码

func trap(height []int) int {
	ans := 0
	n := len(height)
	for i := 0; i < n; i++ {
		lH, rH := 0, 0
		for j := i; j >= 0; j-- {
			lH = max(lH, height[j])
		}
		for j := i; j < n; j++ {
			rH = max(rH, height[j])
		}
		ans += min(lH, rH) - height[i]
	}
	return ans
}
func max(i, j int) int {
	if i > j {
		return i
	}
	return j
}
func min(i, j int) int {
	if i > j {
		return j
	}
	return i
}
func trap(height []int) int {
	ans, cnt := 0, 0
	n := len(height)
	lH, rH := make([]int, n), make([]int, n)
	for i := 0; i < n; i++ {
		cnt = max(cnt, height[i])
		rH[i] = cnt
	}
	cnt = 0
	for i := n - 1; i >= 0; i-- {
		cnt = max(cnt, height[i])
		lH[i] = cnt
	}
	for i := 0; i < n; i++ {
		ans += min(lH[i], rH[i]) - height[i]
	}
	return ans
}
func max(i, j int) int {
	if i > j {
		return i
	}
	return j
}
func min(i, j int) int {
	if i > j {
		return j
	}
	return i
}
func trap(height []int) int {
	ans := 0
	stack := make([]int, 0)
	for i, h := range height {
		for len(stack) > 0 && h > height[stack[len(stack)-1]] {
			top := stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			if len(stack) > 0 {
				break
			}
			left := stack[len(stack)-1]
			curWidth := i - left - 1
			curHeight := min(height[left], h) - height[top]
			ans += curWidth * curHeight
		}
		stack = append(stack, i)
	}
	return ans
}
func min(i, j int) int {
	if i > j {
		return j
	}
	return i
}
func trap(height []int) int {
	ans, n := 0, len(height)
	l, r := 0, n-1
	leftHeight, rightHeight := 0, 0
	for l < r {
		if height[l] < height[r] {
			if height[l] > leftHeight { //当前高度比左侧最高还高,则更新左侧最高
				leftHeight = height[l]
			} else { //当前高度比左侧最高 低, 说明构成凹槽,计算积水量
				ans += leftHeight - height[l]
			}
			l++
		} else {
			if height[r] > rightHeight {//当前高度比右侧最高还高,则更新右侧最高
				rightHeight = height[r]
			} else {//当前高度比右侧最高 低,说明构成凹槽,计算积水量
				ans += rightHeight - height[r]
			}
			r--
		}
	}
	return ans
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-29 12:21:18  更:2022-04-29 12:22:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:27:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码