算法篇:双指针之接雨水
时间:2022-07-24
本文章向大家介绍算法篇:双指针之接雨水,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
算法:
接雨水的题目在leetcode上面出现了两次,不过解法却很不相同,一类是简单的双指针使用场景;一类是栈的典型实用。
这类题目的关键在于对题目的理解,以及拆解成简单的问题。
题目1:
算法:核心在于读懂题目
描述转换成:min(h[i],h[j])*(j-1)的最大值,有了这个之后很容易想到双指针
1. 偏移的策略是,h[i]和h[j]谁小,偏移谁,
2. 因为从上面的公式来看,只有min(h[i],h[j])变大才有可能让乘积变大。
题目2:
题目分析:
我们发现这种蓄水情况,需要先找到最高点,然后分别计算两边的蓄水情况,求和即可。
先找到数组里面最高的位置,然后从两边往中间靠拢,分别计算两边的数据之和。
1. 高1<高2:从左往右,第一个高的入栈,后续比他小或等于的计算数值,求和;
2. 高1==高2:从左往右,算法同1
3. 高1=0: 不入栈,不做计算;// 最左边
题目1:
https://leetcode-cn.com/problems/container-with-most-water/
代码实现:
func maxArea(height []int) int {
if height == nil {
return 0
}
i,j := 0,len(height)-1
sum := 0
for i<j {
h := height[i]
w := j-i
// 移动高度小的那个位置
if height[i] > height[j] {
h = height[j]
j--
} else {
i++
}
tmp := h*w
if tmp > sum {
sum = tmp
}
}
return sum
}
// 算法:核心在于读懂题目
// 描述转换成:min(h[i],h[j])*(j-1)的最大值
// 有了这个之后很容易想到双指针
// 偏移的策略是,h[i]和h[j]谁小,偏移谁,
// 因为从上面的公式来看,只有min(h[i],h[j])变大才有可能让乘积变大。
执行结果:
题目2:
https://leetcode-cn.com/problems/trapping-rain-water/
代码实现:
/*算法:
先找到数组里面最高的位置,然后从两边往中间靠拢,分别计算两边的数据之和。
1.高1<高2:从左往右,第一个高的入栈,后续比他小或等于的计算数值,求和;
2.高1==高2:从左往右,算法同1
3.高1=0: 不入栈,不做计算;// 最左边
*/
func trap(height []int) int {
// step 1: 找到数组的最高点
top := getTopIndx(height)
// step 2: 计算左半部分的蓄水和
sum := Sum(height[:top])
// step 3: 计算右半部分的蓄水和,这里是从右往左的排序,原因是蓄水池的对称性
var rights []int
for i:= len(height)-1; i>top; i--{
rights = append(rights,height[i])
}
sum += Sum(rights)
return sum
}
func getTopIndx(arr []int) int{
if len(arr) == 0 {
return 0
}
max:= arr[0]
top := 0
for idx,v :=range arr {
if max < v {
max = v
top = idx
}
}
return top
}
func Sum(arr []int) int {
if len(arr) == 0 {
return 0
}
var sum int
var max int = arr[0]
for _,v:= range arr {
if max < v {
max = v
continue
}
sum += max - v
}
return sum
}
- 上传文件的陷阱
- BZOJ4872: [Shoi2017]分手是祝愿
- JSONP挖掘与高级利用
- CTF---隐写术入门第二题 小苹果
- 隐含层权重参数的初始化方式的对比实验
- BZOJ4868: [Shoi2017]期末考试
- namespace用法
- 全站缓存时代
- 洛谷P1962 斐波那契数列(矩阵快速幂)
- 负载均衡https转发会让服务器误判
- 凯撒加密之一个神奇的Python的API
- 10分钟搞懂TensorBoard用法
- 【最新TensorFlow1.4.0教程02】利用Eager Execution 自定义操作和梯度 (可在 GPU 运行)
- 清北集训Day1T3 LYK loves jumping(期望DP)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浅谈Android轻量级的数据缓存框架RxCache
- Android开发实现消除屏幕锁的方法
- Android中js和原生交互的示例代码
- 浅谈android获取设备唯一标识完美解决方案
- Android开发实现长按返回键弹出关机框功能
- Android View 完美实现EditText 在软键盘上边的示例
- Android蓝牙通信之搜索蓝牙设备
- Android listview定位到上次显示的位置的实现方法
- Android开发实现生成excel的方法详解
- Android ToolBar 修改边距的实现方法
- Android 自定义view实现TopBar效果
- Android 客户端RSA加密的实现方法
- Android圆形头像拍照后“无法加载此图片”的问题解决方法(适配Android7.0)
- Android 中Failed to read key from keystore解决办法
- Android圆角按钮的制作方法