经典面试题(力扣,接雨水)

news2024/12/24 3:01:09

接雨水

  • 方法一
    • 思路
    • 测试代码
    • 复杂度
    • 测试结果
  • 方法二
    • 思路
    • 测试代码
    • 复杂度
    • 测试结果

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例1:
在这里插入图片描述

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,
在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

示例 2:

输入:height = [4,2,0,3,2,5]
输出:9
提示:

n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105

方法一

思路

我们需要维护一个到当前的前缀最大数组(当前元素的前缀最大的数字),和一个到当前的后缀最大数组(当前元素的后缀最大的数字)。
当我们遍历到当前元素的时候,选出前缀和后缀二者中小的那个减去高度即可,得到当前元素的接住的雨水量.
image.png
比如相对于这个 height = [0,1,0,2,1,0,1,3,2,1,2,1]高度图,
前缀最大数组是 :pre_max:[0,1,1,2,2,2,2,3,3,3,3,3];
后缀最大数组是: sub_max:[3,3,3,3,3,3,3,3,2,2,2,1];
把遍历到的每一个元素当成一个宽度为1的水桶,他的高就是与其索引一样的前缀最大数组和后缀最大数组中的最小的一个。

测试代码

class Solution{
    public int trap(int[] height) {
        int ans=0;
        int n=height.length;
        //数组前缀最大值
        int pre_max[]=new int[n];
        pre_max[0]=height[0];
        //后缀最大值数组
        int sub_max[]=new int[n];
        sub_max[n-1]=height[n-1];
        for (int i = 1; i <n; i++) {
            pre_max[i]=Math.max(height[i],pre_max[i-1]);
        }

        for (int i = n-2; i >=0; i--) {
            sub_max[i]=Math.max(height[i],sub_max[i+1]);
        }
        for (int i = 0; i <n; i++) {
            ans+=Math.min(pre_max[i],sub_max[i])-height[i];
        }
        return ans;
    }
}

复杂度

时间复杂度是:O(n),n,是数组的长度,因为只有三个单层for循环。
空间复杂度是:O(n),创建了两个为长度为n的数组。

测试结果

image.png

方法二

思路

我们可以定义两个变量,来维护相对于当前元素的前缀最大值,和后缀最大值。

image.png

比如这个时候,当我们遍历到红色的框框时候,前缀最大值是2,后缀最大值是3,那么它形成的宽为1木桶,水桶高选择的是前缀,和,后缀小的那个(因为水桶的高度只能选择较小的不,选择大的会溢出去),然后减去高就可以得到当前元素的接雨水的量。

测试代码

class Solution {
    public int trap(int[] height) {
        //答案和
        int ans=0;
        //前缀最大值
        int pre_max=0;
        //后缀最大值
        int sub_max=0;
        int i=0,j=height.length-1;
        while (i<j){
            //更新前缀最大值
            pre_max=Math.max(pre_max,height[i]);
            //更新后缀最大值
            sub_max=Math.max(sub_max,height[j]);
            if (pre_max<sub_max){
                //前缀较小,更新答案
                ans+=pre_max-height[i];
                i++;
            }
            else {
                //后缀较小或者等于情况,更新答案
                ans+=sub_max-height[j];
                j--;
            }
        }
        return ans;
    }
}

复杂度

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

测试结果

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/779330.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java基础——Stream类

文章目录 1 概述2 获取Stream对象3 常用API4 收集Stream流5 总结 1 概述 Stream类用于简化集合和数组操作的API。 Stream类提供了很多可以简化集合操作的api&#xff0c;比如过滤元素 示例如下&#xff1a; 假如一个List集合中存储着字符串&#xff0c;从这些字符串中找到以“…

Java反射 -- 详细介绍 (框架核心)

反射 是 Java框架 的核心 &#xff0c;无论是Tomcat、SpringMVC、Spring IOC、Spring AOP、动态代理 &#xff0c;都使用到了 反射 反射的作用简单讲就是 无需 new 对象&#xff0c;就可以动态获取到一个类的全部信息&#xff0c;包括 属性、方法&#xff0c;构造器&#xff0…

iOS--属性关键字

定义 chat&#xff1a; 在iOS开发中&#xff0c;属性关键字是用于声明类的属性&#xff08;实例变量&#xff09;的修饰符。属性关键字可以影响属性的访问权限、内存管理和生成相关的getter和setter方法。 属性关键字有哪些&#xff1f; 分类属性关键字原子性atomic、nonato…

dpdpdp

这里写目录标题 139. 单词拆分322. 零钱兑换300. 最长递增子序列120. 三角形最小路径和64. 最小路径和63. 不同路径 II5. 最长回文子串&#xff08;回文dp&#xff09;⭐97. 交错字符串⭐&#xff08;抽象成路径问题&#xff09;221. 最大正方形⭐ 139. 单词拆分 class Soluti…

实用便捷!一站式BI系统推荐

在企业数字化转型过程中&#xff0c;BI系统可以建立业务、数据的双驱引擎&#xff0c;形成业务、数据的互补作用&#xff0c;通过建立数字化技术架构&#xff0c;明确企业的战略定位和业务目标&#xff0c;从而支撑实现这个目标。而一站式BI系统&#xff0c;则是指可以轻松从数…

使用Soft-RoCE实践RDMA

RDMA介绍 RDMA&#xff08; Remote Direct Memory Access &#xff09;意为远程直接地址访问&#xff0c;通过RDMA&#xff0c;本端节点可以“直接”访问远端节点的内存。所谓直接&#xff0c;指的是可以像访问本地内存一样&#xff0c;绕过传统以太网复杂的TCP/IP网络协议栈读…

Github 上有没有优秀的Java 项目推荐?

前言 下面是我精心整理的GitHub上关于Java的高Star的项目&#xff0c;可以自己选择去练手喔&#xff0c;希望对你有帮助~ 我们直接进入正题——> 1、 JavaGuide Star&#xff1a;135k JavaGuide指的是一份完整的Java学习指南或学习资料&#xff0c;它提供了Java编程语言…

AcWing4118. 狗和猫

输入样例1&#xff1a; 3 6 10 4 0 CCDCDD 4 1 2 0 CCCC 4 2 1 0 DCCD输出样例1&#xff1a; Case #1: YES Case #2: YES Case #3: NO样例1解释 在 Case 1 中&#xff0c;一共有 1010 份狗粮和 44 份猫粮。 前两只动物是猫&#xff0c;喂食它们后&#xff0c;还剩下 22 份猫粮…

数据结构之BinaryTree(二叉树)的实现

BinaryTree要实现的方法 总结 remove不在BinNode里&#xff0c;而是BinTree里 递归的两种写法 从上往下&#xff1a;同一对象的递归&#xff08;参数多一个&#xff0c;判空用一句话&#xff09;&#xff0c;子对象的递归&#xff08;参数void&#xff0c;判空用两句话&#…

算法分析和设计简答题

算法分析和设计简答题 1.1分治法的算法思想&#xff08;重点&#xff09; 1.2动态规划的算法思想&#xff08;重点&#xff09; 1.3贪心算法的算法思想 1.4回溯算法的算法思想 1.5分支限界法的算法思想 1.6时间复杂度的定义(最好/一般/坏)&#xff0c;有什么意思 1.7渐进记号…

【Git】分支合并冲突产生与解决

文章学习自&#xff1a;麦兜搞IT&#xff0c;如有侵权&#xff0c;告知删除 文章目录 前言1 Fast Forword 合并1.1 核心原理1.2 举个栗子1.3 经验之谈 2 three way merge2.1 核心原理2.2 举个栗子&#xff08;不带冲突&#xff09;2.3 带冲突的three way merge 3 变基rebase3.…

Windows上配置Python环境变量

Python配置环境变量 &#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; Python下载官网&#xff1…

GB28181设备接入端如何播放语音广播数据?

技术背景 语音广播功能是GB28181设备接入端非常重要的功能属性&#xff0c;语音广播让终端和平台之间&#xff0c;有了实时双向互动&#xff0c;可以满足执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育、远程办公、明厨亮灶、智慧交通、智慧工地、雪亮工程、平安乡村、…

Docker介绍以及实战教程

Docker简介 Docker为什么出现 从事软件开发的朋友&#xff0c;可能经常会碰到以下场景&#xff1a;运维&#xff1a;你这程序有Bug啊&#xff0c;怎么跑不起来啊&#xff01;开发&#xff1a;我机子上能跑啊&#xff0c;你会不会用啊究其原因还是开发环境与生产环境不同造成的…

基于linux下的高并发服务器开发(第二章)- 2.18 内存映射(2)

1.如果对mmap的返回值(ptr)做操作(ptr), munmap是否能够成功? void * ptr mmap(...);ptr; 可以对其进行操作munmap(ptr, len); // 错误,要保存地址 2.如果open时O_RDONLY, mmap时prot参数指定PROT_READ | PROT_WRITE会怎样? 错误&#xff0c;返回MAP_FAILEDopen()函数中的…

cpolar+calibre搭建自己的kindle书库

cpolarcalibre搭建自己的kindle书库 在我们身边众多的便携电子设备中&#xff0c;Kindle无疑是最为矛盾的设备之一&#xff0c;很多人在买它时都想读书破万卷&#xff0c;可是到最后Kindle的归宿都是盖泡面。尽管如此&#xff0c;当亚马逊不讲武德&#xff0c;打算将Kindle真正…

FPGA中RAM的结构理解

FPGA中RAM的结构理解 看代码的过程中对RAM的结构不是很理解&#xff0c;搞脑子一片浆糊&#xff0c;反复推算&#xff0c;好不容易理清了思路&#xff0c;记录下来&#xff0c;防止忘记。开辟的RAM总容量为128bytes&#xff0c;数据的位宽为32位&#xff08;即一个单元有32bit…

CodeForces:Madoka and Underground Competitions

经过观察&#xff0c;发现只要延小区域 右上-左下 的对角线填满X即可&#xff0c;那么就是可以总结为满足(i j) % k (r c) % k #include <bits/stdc.h> using namespace std; int t; void solve(){int n, k, r, c;cin >> n >> k >> r >> c…

团队如何选择合适的Git分支策略?

现代软件开发过程中要实现高效的团队协作&#xff0c;需要使用代码分支管理工具实现代码的共享、追溯、回滚及维护等功能。目前流行的代码管理工具&#xff0c;包括CVS&#xff0c;SVN&#xff0c;Git&#xff0c;Mercurial等。 相比CVS和SVN的集中管理&#xff0c;Git具有非常…