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

leecode42 接雨水

在这里插入图片描述

总结

这个题感觉好难,我想不到什么好的方法,刚开始想的和后续做的只能是暴力解法,虽然做出来了,但是时间复杂度很高,最后膜拜了这个灵神的做法,灵神还是太超模了,感觉和我这个菜鸟不在一个水平

不过我虽然做的没有灵神巧妙,我的做法也是有一定的可取之处的,我的思路中最关键的一步就是对已经统计过的柱子进行抬高,防止下一轮重复。

灵神的思路主要是通过单独设置一个左挡板和右挡板对每一个柱子进行计算,最后取和。

我的思路

  1. 定义一个左指针和右指针,利用这两个指针进行遍历

    1. 首先先找到这个左指针和右指针指向位置不为0的下标,
    2. 然后我们找出这两个位置中的最小值,则我们可以先把这个中间的位置能存多少水算出来,
      统计完之后将这个柱子抬高吗,抬高是关键,因为后续可能还会统计到这个位置,必须把上一次统计造成的影响消除
      在这里插入图片描述
  2. 代码如下所示

public int trap(int[] height) {int len = height.length;int left = 0, right = len - 1;int ans = 0;int min = 0; while (left < right) {if (height[left] == 0) {left++;continue;}if (height[right] == 0) {right--;continue;}int newMin = Math.min(height[left], height[right]);if (min < newMin) {min = newMin;}// 直接算当前区间所有 < Min 的柱子for (int i = left + 1; i < right; i++) {if (height[i] < newMin) {ans += newMin - height[i];//把这些柱子“虚拟抬高”到 newMin,下一轮不会重复加height[i] = newMin; }}// 指针移动规则不变if (height[left] < height[right])left++;elseright--;}return ans;
}

灵神的思路

灵神的思路是对于每一个块进行分析,

在这里插入图片描述

灵神第一种解法,利用两个数组进行记录

public int trap(int[] height) {int len = height.length;int[] left_max = new int[len];int[] right_max  = new int[len];left_max[0] = height[0];for(int i = 1;i<len;i++){left_max[i] = Math.max(left_max[i-1],height[i]);}right_max[len-1]=height[len-1];for(int i=len-2;i>=0;i--){right_max[i]=Math.max(right_max[i+1],height[i]);}int ans=0;for(int i=0;i<len;i++){ans+=Math.min(left_max[i],right_max[i])-height[i];}return ans;
}

灵神第二种解法,不用额外数组

  • 这个思路的关键就在于,每次当左边的挡板小于右边的挡板的时候,说明它只能够接左边挡板那么高的水,同理,当右边的挡板大于左边的挡板的时候,说明它只能够能够接右边挡板那么高的水

在这里插入图片描述

class Solution {public int trap(int[] height) {int ans = 0;int preMax = 0; // 前缀最大值,随着左指针 left 的移动而更新int sufMax = 0; // 后缀最大值,随着右指针 right 的移动而更新int left = 0;int right = height.length - 1;while (left < right) {preMax = Math.max(preMax, height[left]);sufMax = Math.max(sufMax, height[right]);if (preMax < sufMax) {ans += preMax - height[left];left++;} else {ans += sufMax - height[right];right--;}}return ans;}
}
作者:灵茶山艾府
链接:https://leetcode.cn/problems/trapping-rain-water/solutions/1974340/zuo-liao-nbian-huan-bu-hui-yi-ge-shi-pin-ukwm/
来源:力扣(LeetCode
http://www.dtcms.com/a/309497.html

相关文章:

  • Mysql join语句
  • ansible简单playbook剧本例子2
  • CMake set_source_files_properties使用解析
  • 如何通过黑白棋盘进行定位配准融合?(前后安装的两个相机)
  • 大模型微调实战 -基于SWIFT框架
  • 南太平洋金融基建革命:斐济-巴新交易所联盟的技术破局之路 ——从关税动荡到离岸红利,跨境科技如何重塑太平洋资本生态
  • 使用Gemini API开发领域智能聊天机器人的思路
  • js判断是个变量和属性是否是有效值
  • PixelCNN介绍:VQ-VAE的前一步探索
  • 2025年Python Web框架之争:Django、Flask还是FastAPI,谁将主宰未来?
  • JsHook入门
  • 什么是爬虫协议?
  • 如何优雅删除Docker镜像和容器(保姆级别)
  • 热能小车cad【12张】三维图+设计说明书
  • 机械学习中的一些优化算法(以逻辑回归实现案例来讲解)
  • 【Flutter3.8x】flutter从入门到实战基础教程(五):Material Icons图标的使用
  • 燃气营商环境测评:以用户反馈推动服务升级​(第三方市场调查)
  • 逻辑回归----银行贷款模型优化
  • 嵌入式教学的云端革命:高精度仿真如何重塑倒车雷达实验与工程教育——深圳航天科技创新研究院赋能新一代虚实融合实训平台
  • IIS 让asp.net core 项目一直运行
  • Linux文件系统理解2
  • OpenGL Camera
  • 【03】海康MVS V4.3.0 ——安装教程、查看示例、库、头文件、开发指南
  • vue项目预览pdf隐藏工具栏和侧边栏
  • YOLOv8/YOLOv11 C++ OpenCV DNN推理
  • 人机协作!智慧环卫如何实现按需清扫?
  • 【支持Ubuntu22】Ambari3.0.0+Bigtop3.2.0——Step7—Mariadb初始化
  • 链接脚本中. = ALIGN(4);的作用?
  • C++ --- stack和queue的使用以及简单实现
  • 高级11-Java日志管理:使用Log4j与SLF4J