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

【CT】LeetCode手撕—42. 接雨水

目录

  • 题目
  • 1- 思路
  • 2- 实现
    • ⭐42. 接雨水——题解思路
  • 3- ACM实现

题目

  • 原题连接:42. 接雨水

1- 思路

模式识别:求雨水的面积 ——> 不仅是只求一个比当前元素大的元素,还要求面积

单调栈

  • 应用场景,需要找到左边比当前元素大的元素

单调栈实现

  • 当前元素和栈口元素作比较,如果当前元素大于栈口元素,此时收集结果:
  • 例如 栈口元素是 10,如果当前元素是 30
    • 此时找到 元素 10 右侧第一个比 它大的元素值是 30
    • 右侧第一个比他大的元素是 栈里的第二个元素

单调栈的维护

  • 单调栈与当前元素,存在三种情况,① 等于、②小于、③大于。要用单调栈来存储遍历过的元素
    • 如果小于等于 栈口元素,此时直接入栈
    • 如果大于栈口元素,此时收集结果
      • ①凹槽底部元素:int mid = st.top(); st.pop();
      • ②计算水高:int h = Math.min(st.top(),height[i])-height[mid]; 从右侧柱高,和左侧柱高取个最小值
      • ③计算雨水面积宽度:int width = i - st.pop() - 1;
      • ④计算面积:area = h * width;

2- 实现

⭐42. 接雨水——题解思路

在这里插入图片描述

class Solution {public int trap(int[] height) {int sum = 0;if(height.length == 0){return 0;}// 定义栈Stack<Integer> st = new Stack<Integer>();st.push(0);for(int i = 1 ; i < height.length;i++){if(height[i] <= height[st.peek()]){st.push(i);}else{while(!st.isEmpty() && height[i] > height[st.peek()]){int mid = st.peek();st.pop();if(!st.isEmpty()){int h = Math.min(height[st.peek()],height[i]) - height[mid];int width = i-st.peek() - 1; int hold = h*width;sum+=hold;}}st.push(i);}}return sum;}
}

3- ACM实现

public class getRain {public static int getRain(int[] nums){// 定义单调栈int len = nums.length;if(len==0){return 0;}int sum = 0;Stack<Integer> st = new Stack<>();st.push(0);for(int i = 1 ; i < len;i++){if(nums[i]<=nums[st.peek()]){st.push(i);}else{while(!st.isEmpty() && nums[i] > nums[st.peek()]){int mid = st.peek();st.pop();if(!st.isEmpty()){int h = Math.min(nums[st.peek()],nums[i])-nums[mid];int width = i - st.peek()-1;int hold = h*width;sum+=hold;}}}st.push(i);}return sum;}public static void main(String[] args) {// 计算Scanner sc = new Scanner(System.in);System.out.println("输入数组长度");int n = sc.nextInt();int[] nums = new int[n];for(int i = 0 ; i < n ; i ++){nums[i] = sc.nextInt();}System.out.println("雨水面积是"+getRain(nums));}
}
http://www.lryc.cn/news/379686.html

相关文章:

  • GPT-4o一夜被赶超,Claude 3.5一夜封王|快手可灵大模型推出图生视频功能|“纯血”鸿蒙大战苹果AI|智谱AI“钱途”黯淡|月之暗面被曝进军美国
  • C# + easyui 写的一个web项目
  • JVM 垃圾回收分配及算法
  • 尚品汇-(四)
  • colima配置docker镜像源
  • Linux_内核缓冲区
  • 步步精:连接器领域的卓越品牌
  • 【Linux】基础IO_3
  • ffmpeg音视频开发从入门到精通——ffmpeg实现音频抽取
  • 计算机系统基础实训七-MallocLab实验
  • 周末总结(2024/06/22)
  • 2024.06.22【读书笔记】丨生物信息学与功能基因组学(第十七章 人类基因组 第二部分)【AI测试版】
  • SpringCloud-nacos基础
  • git的Cherry pick
  • LLC开关电源开发:第四节,LLC软件设计报告
  • 力扣85.最大矩形
  • 和琪宝的厦门之旅~
  • 4、MFC:菜单栏、工具栏与状态栏
  • Java中的动态代理:原理与应用
  • DataWhale - 吃瓜教程学习笔记(二)
  • [保姆级教程]uniapp自定义标签页切换组件
  • 4种典型家庭教育方式,无论开始是哪一种,都会过渡到最后一种
  • [Django学习]查询过滤器(lookup types)
  • 异步开发的终极答案—协程
  • 构建高效的大数据量延迟任务调度平台
  • Python武器库开发-武器库篇之ThinkPHP 2.x 任意代码执行漏洞(六十三)
  • SQLite数据库(数据库和链表双向转换)
  • React框架的来龙去脉,react的技术原理及技术难点和要点,小白的进阶之路
  • CPU飙升100%怎么办?字节跳动面试官告诉你答案!
  • 物理层(二)