当前位置: 首页 > news >正文

25.6.12学习总结

双指针(Two Pointers)

11. 盛最多水的容器https://leetcode.cn/problems/container-with-most-water/

int maxArea(int* height, int heightSize) {int ans = 0, l = 0, r = heightSize - 1; // 初始化双指针while (l != r) { // 只要两个指针没有相遇int temp = height[r] > height[l] ? height[l] : height[r]; // 较小的高度作为容器高度ans = ans > ((r - l) * temp) ? ans : ((r - l) * temp); // 计算面积并更新最大值if (height[r] > height[l]) l += 1; // 左边低,左指针右移else r -= 1; // 右边低或相等,右指针左移}return ans;
}

为什么这样能保证找到最大值?

  • 容器的容量由两部分决定:宽度(r - l) 短板高度 min(height[l], height[r])

  • 每次我们选择移动较矮的那个指针,因为我们想尝试寻找一个更高的高度来弥补宽度减少带来的损失。

  • 因为如果保留较高的那个柱子,可能还能找到一个更高一点的柱子来配对,从而提升容量。

42. 接雨水https://leetcode.cn/problems/trapping-rain-water/

解法一:动态规划 / 前后缀最大值法(Dynamic Programming with Prefix and Suffix Max)

📌 思路说明:

对于每个柱子来说,它能接到的雨水量等于:

min(左边最高柱子的高度, 右边最高柱子的高度) - 当前柱子高度

所以这个方法的步骤如下:

  1. 从前往后遍历 数组,记录每个位置左侧的最大高度(qmax[i])。

  2. 从后往前遍历 数组,记录每个位置右侧的最大高度(pmax[i])。

  3. 最后再遍历一次数组,计算每个位置可以接的雨水量。

int trap(int* height, int heightSize) {int ans = 0;int qmax[heightSize], pmax[heightSize], max = 0;// 从左到右记录当前最大高度(左边最高)for (int i = 0; i < heightSize; i++) {if (height[i] > max)max = height[i];qmax[i] = max;}max = 0;// 从右到左记录当前最大高度(右边最高)for (int i = heightSize - 1; i >= 0; i--) {if (height[i] > max)max = height[i];pmax[i] = max;}// 每个位置能接的水 = min(左边最高, 右边最高) - 当前高度for (int i = 0; i < heightSize; i++) {int temp = qmax[i] > pmax[i] ? pmax[i] : qmax[i];ans += (temp - height[i] > 0 ? temp - height[i] : 0);}return ans;
}

解法二:双指针 + 动态判断法(Two Pointers with Greedy Approach)

📌 思路说明:

这是一个优化版本,不需要额外数组。通过维护两个指针 lr,以及两个变量 pre(左边最大)和 suf(右边最大),我们可以边移动指针边计算能接的雨水。

  • 如果左边最大值小于右边最大值,那么当前 l 位置的水由 pre 决定;

  • 否则,r 位置的水由 suf 决定。

这样我们可以在一次遍历中完成整个计算。

int trap(int* height, int heightSize) {int ans = 0, r = heightSize - 1, l = 0, pre = 0, suf = 0;while (l <= r) {// 更新左右两边的最大高度pre = pre > height[l] ? pre : height[l];suf = suf > height[r] ? suf : height[r];// 谁小谁决定当前能接的水量if (pre > suf) {ans += (suf - height[r]);r -= 1;} else {ans += (pre - height[l]);l += 1;}}return ans;
}

对比总结:

特性

解法一(前后缀最大值)

解法二(双指针优化)

算法类型

动态规划(DP)

双指针 + 贪心策略

是否使用额外数组

是(两个数组)

时间复杂度

O(n)

O(n)

空间复杂度

O(n)

O(1)

易理解性

更直观、清晰

略难理解,但更高效


文章转载自:

http://fYg2vE94.qbfkz.cn
http://edLrtDOj.qbfkz.cn
http://ws0zbB8X.qbfkz.cn
http://VTirAMub.qbfkz.cn
http://5uOdCKxc.qbfkz.cn
http://WyqHCR3j.qbfkz.cn
http://MaEQhMgK.qbfkz.cn
http://ZoW3RWgn.qbfkz.cn
http://Ib0nLRrJ.qbfkz.cn
http://BwFe3x0z.qbfkz.cn
http://v7DK0tsH.qbfkz.cn
http://qNlrNzVV.qbfkz.cn
http://zYMHnwbS.qbfkz.cn
http://1PMdR895.qbfkz.cn
http://uM7XWbg3.qbfkz.cn
http://6Y3nm8H0.qbfkz.cn
http://rY58Hq8Z.qbfkz.cn
http://jE2mEmgw.qbfkz.cn
http://Bji2tKYQ.qbfkz.cn
http://mjWItpAF.qbfkz.cn
http://kg6vKvMY.qbfkz.cn
http://kSeWOicV.qbfkz.cn
http://AvtvNug0.qbfkz.cn
http://p7ZZXH4C.qbfkz.cn
http://Dpk6dts0.qbfkz.cn
http://EV4U8JJ2.qbfkz.cn
http://0MExzbL5.qbfkz.cn
http://rDmZswS3.qbfkz.cn
http://hOZ3QFTn.qbfkz.cn
http://t86dLrBE.qbfkz.cn
http://www.dtcms.com/a/246871.html

相关文章:

  • 深入解析 IPOIB 驱动:从 IP 报文传输到自定义协议族改造
  • Git 首次使用完整设置指南
  • 大模型辅助商业决策
  • Qt 环境搭建全流程详解:从下载到创建首个项目
  • LangGraph--带记忆和工具的聊天机器人
  • 快递鸟电商退换货技术全解析:构建智能化逆向物流管理体系
  • 每日八股文6.12
  • AS610x奇力科技电池管理系统(BMS)模拟前端(AFE)
  • 黑马点评面试话术
  • 汽车电池智造关键一环!DeviceNet转Modbus RTU网关的实战突围
  • 【阿里巴巴 x 浙江大学】信息与交互设计 - 交互设计原则与思维
  • Python基于Django的棉花数据平台建设与可视化系统【附源码、文档说明】
  • QT+VTK 中QWidget与QVTKOpenGLNativeWidget的使用
  • 下载量飙升153.6%,《Solvely》如何成为出海AI教育应用新晋“黑马“?
  • riverpod最基本例子:在一个组件里更新状态,在另一个组件里获取更新的数据
  • Python训练营打卡 Day52
  • 实战解析:如何用克魔(KeyMob)等工具构建iOS应用稳定性与数据可观测体系
  • windows下tokenizers-cpp编译
  • 【leetcode】104. 二叉树的最大深度
  • 【阿里巴巴 x 浙江大学】信息与交互设计 - 交互设计流程与要素
  • 在 IntelliJ IDEA 中运行时出现“Log already in use? tmlog in ./“
  • 面对3倍流量激增,「纽约时报」如何既稳又省?
  • 楼宇自控新方向:电力载波技术——低成本、高兼容性的智能未来
  • cocos android打包 错误总结
  • 瑞芯微 MIPI D-PHY 接收器(RX)驱动学习笔记
  • Vue + Vite 项目部署 Docker 全攻略:原理、路由机制、问题排查与开发代理解析
  • OBS Studio是什么?应用场景有哪些?
  • 一步一步学python之(4)编写第一个python程序(Pycharm)
  • FastDFS
  • 第七节 工程化与高级特性-装饰器(Decorators)的应用场景