面试经典150题——接雨水

devtools/2024/9/24 7:16:29/

面试经典150题 day16

      • 题目来源
      • 我的题解
        • 方法一 暴力解法
        • 方法二 备忘录优化
        • 方法三 双指针
        • 方法四 单调栈

题目来源

力扣每日一题;题序:42

我的题解

方法一 暴力解法

计算每一个位置的水有多少。找到每个位置的左侧最大值和右侧最大值,然后取两者中的较小的(水桶装水原理),如果较小的大于当前位置,则表示该位置可以接雨水,接雨水的量:min(leftMax,rightMax)-cur
以前是能过的,现在好像过不了了

时间复杂度:O( n 2 n^2 n2)
空间复杂度:O(1)

java">class Solution {public  int trap(int[] height) {int res=0;for(int i=1;i<height.length-1;i++){//左侧最大值的位置int left=findMax(height,0,i);//右侧最大值的位置int right=findMax(height,i,height.length);//两者中的较小值int min=Math.min(height[left],height[right]);if(min>=height[i])res+=min-height[i];}return res;}//找最大值所在位置private  int findMax(int[] height, int s, int e) {int max=height[s];int index=s;for(int i=s;i<e;i++){if (height[i] > max) {max=height[i];index = i;}}return index;}
}
方法二 备忘录优化

在方法一中求左侧和右侧的最大值都会重复计算,因此可以提前预先计算每个位置的左侧和右侧最大值

时间复杂度:O(n)
空间复杂度:O(n)

java">public  int trap(int[] height) {int res=0;int n=height.length;int[] left=new int[n];int[] right=new int[n];left[0]=height[0];right[n-1]=height[n-1];for(int i=1;i<n;i++)left[i]=Math.max(left[i-1],height[i]);for(int i=n-2;i>=0;i--)right[i]=Math.max(right[i+1],height[i]);for(int i=1;i<height.length-1;i++){int min=Math.min(left[i],right[i]);res+=min-height[i];}return res;
}
方法三 双指针

两个指针分别指向还未被遍历的最左侧和最右侧,然后依次遍历每个位置,leftMax和rightMax不再是当前位置左侧和右侧的最大值,而是[0,left]和[right,end]中的最大值。

时间复杂度:O(n)
空间复杂度:O(1)

java">class Solution {public static int trap(int[] height) {int res=0;int left=0,right=height.length-1;int leftMax=height[left],rightMax=height[right];while(left<right){if(height[left]<height[right]){//找左边最大if(height[left]>leftMax)leftMax=height[left];elseres+=leftMax-height[left];left++;}else{//找右边最大if(height[right]>rightMax)rightMax=height[right];elseres+=rightMax-height[right];right--;}}return res;}
}
方法四 单调栈

该方法计算雨水量是横向计算每个水平面可以接的雨水量。
用单调栈计算能接的雨水总量。维护一个单调栈,单调栈存储的是下标,满足从栈底到栈顶的下标对应的数组 height 中的元素递减。
从左到右遍历数组,遍历到下标 iii 时,如果栈内至少有两个元素,记栈顶元素为 top,top 的下面一个元素是 left,则一定有 height[left]≥height[top]。如果 height[i]>height[top],则得到一个可以接雨水的区域,该区域的宽度是 i−left−1,高度是 min⁡(height[left],height[i])−height[top],根据宽度和高度即可计算得到该区域能接的雨水量。
为了得到 left,需要将 top 出栈。在对 top 计算能接的雨水量之后,left 变成新的 top,重复上述操作,直到栈变为空,或者栈顶下标对应的 height中的元素大于或等于 height[i]。
在对下标 i 处计算能接的雨水量之后,将 i 入栈,继续遍历后面的下标,计算能接的雨水量。遍历结束之后即可得到能接的雨水总量。

时间复杂度:O(n)
空间复杂度:O(n)

java">class Solution {public static int trap(int[] height) {int res=0;Stack<Integer> stack=new Stack<>();int i=0;while(i<height.length){while(!stack.isEmpty()&&height[stack.peek()]<height[i]){int low=stack.pop();if(stack.isEmpty())break;int min=Math.min(height[stack.peek()],height[i]);int width=i-stack.peek()-1;res+=width*(min-height[low]);}stack.push(i++);}return res;}
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~


http://www.ppmy.cn/devtools/13194.html

相关文章

《智能前沿:应对ChatGPT算力挑战》

在全球人工智能热潮中&#xff0c;以 ChatGPT 为代表的 AIGC 技术引发了广泛关注。人工智能和机器学习等技术对数据规模及处理速度等提出了更高要求。在数据成为主要生产要素的当下和未来&#xff0c;如何跟上时代的发展步伐&#xff0c;构建适应 AI 需求的数据中心&#xff0c…

windows下如何安装git

在FreeBSD和Linux下习惯了pkg install 和apt install之后&#xff0c;windows下怎么安装git反而不会了。尤其是在github抽风的时候&#xff0c;不知道该到哪里去下载。在“Microsoft Store”里也没有找到&#xff0c;确切的说查找git后&#xff0c;显示出来的都是vscode、Visua…

基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2013B 3.部分核心程序 .............................................................................. %我们这里…

Node.js 环境变量动态获取和静态获取的区别

Node.js 环境变量动态获取和静态获取的区别 Node.js 环境 vs 浏览器环境 process.env.SERVICE_PORTAL: 适用环境&#xff1a;Node.js 环境。用途&#xff1a;访问操作系统的环境变量。 import.meta.env.SERVICE_PORTAL: 适用环境&#xff1a;浏览器环境&#xff0c;特别是在使…

LLAMA 3的测试之旅:在GPT-4的阴影下前行

Meta终于发布了他们长期期待的LLAMA 3模型&#xff0c;这是一个开源模型&#xff0c;实际上提供了一系列新的功能&#xff0c;使得模型在回答问题时表现得更好。这对AI社区来说是一个真正的里程碑事件。 Meta正在发布新版本的Meta AI&#xff0c;这是一种可以在他们的应用程序和…

【Linux开发 第五篇】vi和vim

vi和vim Linux系统会内置Vi编辑器 Vim具有程序编辑的能力&#xff0c;可以看作是Vi的增强版本&#xff0c;可以主动的以字体颜色辨别语法的正确性&#xff0c;方便程序设计 三种模式 正常模式&#xff1a;vim打开一个文档就直接进入一般模式&#xff0c;可以进行复制&#x…

22长安杯电子取证复现(检材一,二)

检材一 先用VC容器挂载&#xff0c;拿到完整的检材 从检材一入手&#xff0c;火眼创建案件&#xff0c;打开检材一 1.检材1的SHA256值为 计算SHA256值&#xff0c;直接用火眼计算哈希计算 9E48BB2CAE5C1D93BAF572E3646D2ECD26080B70413DC7DC4131F88289F49E34 2.分析检材1&am…

Centos7系统下安装Nginx并配置域名转发实现域名访问

感谢李天健同学辛苦创作&#xff0c;对于Nginx配置未完成的同学请移步他的博客。 传送门&#xff1a;Centos7系统下安装Nginx并配置域名转发实现域名访问 传送门2&#xff1a;1.24.0