带你手撕单调栈(二)

暴力破解Leetcode 42:接雨水问题 问题描述 给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。(数组以外的区域高度视为0)数据范围:1≤n≤1000000,数组中每个值满足 >=0示例输入:[3,1,2,5,2,4]返回值:5说明:数组 [3,1,2,5,2,4] 表示柱子高度,在这种情况下,可以接 5个单位的雨水,蓝色的为雨水。 阅读详情

带你手撕单调栈(二)

思路请看

描述

给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。

img

示例1

输入:

[3,1,2,5,2,4]  

复制

返回值:

5 

复制

说明:

数组 [3,1,2,5,2,4] 表示柱子高度图,在这种情况下,可以接 5个单位的雨水,蓝色的为雨水 

示例2

输入:

[4,5,1,3,2]

返回值:

2 
class Solution {
public:
    /**
     * max water
     * @param arr int整型vector the array
     * @return long长整型
     */
    long long maxWater(vector<int>& arr) {
        // write code here
        /**
            拿到题目先分析
            这个东西,要知道某个地点能蓄水多少就要知道左边比自己高的第一个高度是多少,右边的比自己高的第一个高度是多少
            那么怎么求右边比自己高度是多少
            又发现是一个先进后出的结构,正好要计算左右,那么我们就一正一反的来
        **/
        // 先求右边,这是正向的,处理在while里面
        stack<int> st;
        vector<int> right_high(arr.size(),-1);
        for(int i=0;i<arr.size();i++) {
            while(!st.empty() && arr[st.top()]<=arr[i]) {
                right_high[st.top()] = i;
                st.pop();  // 正的不能直接pop后不管
            }
            
            st.push(i);
        }
        
        // 清空st
        while(!st.empty()) {
            st.pop();
        }
        
        // 开始倒序,加入哨兵节点
        arr.insert(arr.begin(), 0);
        vector<int> left_hight(arr.size());
        for(int i=0;i<arr.size();i++) {
            while(!st.empty() && arr[st.top()]<=arr[i]) {
                st.pop();
            }
            left_hight[i]=st.empty()?-1:st.top()-1; // 这是反向的处理在while外面
            st.push(i);
        }
        left_hight.erase(left_hight.begin());
        arr.erase(arr.begin());
        
//         for(auto value : left_hight) {
//             cout<<value<<" ";
//         }
//         cout<<endl;
//         for(auto value : right_high) {
//             cout<<value<<" ";
//         }
//         cout<<endl;
        
        long long res = 0;
        for(int i=0;i<left_hight.size();i++) {
            if(left_hight[i]>=0 && right_high[i]>=0) {
                res+=(min(arr[left_hight[i]],arr[right_high[i]])-arr[i])*(long long)(right_high[i]-left_hight[i]-1);
            }
        }
        return res;
        
    }
};
大厂技术面试中的手撕代码应该如何准备? 不管是秋招还是社招,互联网大厂的技术面试中的手撕代码这一部分总是绕不过去的一关。不只是后端开发和算法岗,现在就连前端、运维、测试、数据等岗位也要考手撕代码了。 阅读详情

相关推荐

算法总结——单调栈

单调栈不是一种新的数据结构,它在结构上仍然是一个普通栈,只是在使用方法上有所区别。单调栈内的元素是单调递增或递减的,因此有单调递增栈和单调递减栈。单调递增栈: 栈中元素从栈底到栈顶是递增的。单调递减栈: 栈中元素从栈底到栈顶是递减的。我们在使用单调栈的时候,要时刻保证栈的单调性,例如,单调递增栈:栈中元素从栈底到栈顶是递增的。当一个元素入栈时,与栈顶比较,若比栈顶大,则入栈;若比栈项小,则弹出栈顶,直到这个数能入栈为止。注意:每个元素都一定入栈。

阿标de杂货铺 6131

牛客-接雨水问题

题目 描述 给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。(数组以外的区域高度视为0) 要求:空间复杂度 O(1),时间复杂度 O(n) 思路 每一个位置的雨水是由它“左边最高和右边最高中最小的”决定的,所以第一个位置和最后一个位置肯定不会接到雨水,我们从左往右开始遍历,每走一步前判断是否要更新左边最高和右边最高。同时如果每走一步的值和上一步相同,就不需要再更新。 代码 python版本: # # 代码中的类名、方法名、参数名已经

weixin_41803339的博客 348

单调栈详解

定义: 单调栈,顾名思义就是栈内元素单调按照递增(递减)顺序排列的栈。 适用问题: 要知道单调栈的适用于解决什么样的问题,我们首先需要知道单调栈的作用。单调栈分为单调递增栈和单调递减栈,通过使用单调栈我们可以访问到下一个比他大(小)的元素(或者说可以)。也就是说在队列或数组中,我们需要通过比较前后元素的大小关系来解决问题时我们通常使用单调栈。下面我们通过简单介绍单调减栈和单调增栈问题来进一步...

weixin_42784951的博客 3万+

NC128 接雨水问题

描述 给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。(数组以外的区域高度视为0) 数据范围:0≤n≤1060 \le n \le 10^60≤n≤106 ,数组中每个值满足 0<val≤1090 < val \le 10^90<val≤109 要求:空间复杂度 O(1),时间复杂度 O(n) 示例1 输入:[3,1,2,5,2,4] 返回值:5 说明:数组 [3,1,2,5,2,4] 表示柱子高度图,在这种情况

zhinen丶的博客 605

2025华为OD面试手撕代码真题目录及面试八股文

本专栏更新每年华为OD机试的高频手撕代码题,每个题目都会使用五种语言进行解答(C & C++& Java & Python & JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2024e卷,od机试,2024E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2024华为od,如何备

KJ.JK 5万+

华为OD面试手撕真题目录

2026最新华为OD面试手撕真题 , 提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解.

qq_45776114的博客 1万+

给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。

题目描述 给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。 一、思路 能装多少水是由左右两边较低的边决定的,因此采用双指针,从开头和最后向中间靠拢,当位置i的数小于较低边表示可以装水。当位置i的数大于较低边时,更新较低边为位置i的值。 二、代码 public long maxWater (int[] arr) { // write code here if(arr.length < 1){ ret

qq_42070135的博客 2280

华为OD 面试手撕代码真题【加油站】

华为OD 面试手撕代码真题【加油站】

MISAYAONE的博客 6340

C语言实现接雨水问题

描述 给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。 输入:[3,1,2,5,2,4] 返回值:5 说明:数组 [3,1,2,5,2,4] 表示柱子高度图,在这种情况下,可以接 5个单位的雨水,蓝色的为雨水 接雨水问题_牛客题霸_牛客网 (nowcoder.com) 解释: 设置两个水量,一个临时水量,一个最终水量;两个下标啊a,b, a指向开始出不动,b指向开始出加一往右移动;b下标对应的值如果比a下标对应.

i_Crave的博客 1511

基于机器学习和辐射传输的地表温度模拟方法对比

对于不同的地表类型和不同的年份,经验方法是实用的,虽然整体精度不如物理方法,但具有计算速度快、对模型内部结构考虑较少等优点。尽管深度学习等回归的经验方法不需要考虑辐射传输和能量平衡的具体过程, 但在其输入参数的选择上也不能是无序和随机的,而是应选择有关相应物理过程的参数。经验方法在处理不同年份相同地表类型或表现相对较好, RMSE 约为 1.50K,但在不同地表类型且不同年份模拟结果较差, RMSE 约为 3.0K, 虽然精度不如物理方法,但它具有计算速度快,不需过多考虑模型内部结构的优点。

2301_77907355的博客 1021

本地部署了qwen2.5:0.8b ,对接openclaw 后,电脑卡的要死

OpenClaw 强制 16k 上下文 + 无限历史 + Agent 调度,把 0.8b 压垮。按上面配置:轻量化 + 限历史 + 驻留显存,电脑立刻不卡。

专注于技术研发行业技术主要有AI人工智能视觉识别、物联网技术、电商平台、app原生技术、微信小程序、鸿蒙语言开发、办公企业oa、ERP等,致力于做东半球最优秀的程序员 978

手撕算法——单调栈

单调栈模板 Stack<Interger> stack=new stack<>(); for(int i=0;i<nums.length;i++){ while(!stack.empty()&&nums[i]>stack.peek()){ //记录结果 } stack.push(nums[i]); } while(!stack.empty()){ //处理剩余元素 } 相关题型 下一个更大的元素 题目描述:496. 下一个更大元素 I 给定两

雨后——rjgc_wq@163.com 389

别再为跨页读写发愁了!STM32F407模拟I2C驱动24C256/512的避坑指南

本文详细解析了STM32F407模拟I2C驱动24C256/512的跨页写入问题,揭示了24C系列存储器'写满一页不会自动翻页'的关键机制,并提供了经过验证的分页写入算法和优化方案。通过GPIO时序优化、地址计算和错误处理等技巧,帮助开发者解决数据错乱、覆盖等常见问题,实现稳定可靠的EEPROM读写操作。

weixin_42631411的博客 377

带你手撕单调栈(一)

单调栈 文章目录单调栈是么时候用单调栈怎么用好单调栈模板例题[739. 每日温度](https://leetcode-cn.com/problems/daily-temperatures/)正序倒序+哨兵[496. 下一个更大元素 I](https://leetcode-cn.com/problems/next-greater-element-i/)前序遍历后序遍历+哨兵 是么时候用单调栈 一定要记住的是数据结构一定是辅助我们解题的,一定是在暴力解法的方式下进行优化(其实也就是以空间换时间) 单调栈一定要符

ahelloyou的博客 296

ZYNQ-7035+HMCAD1511高速数据采集系统设计

高速数据采集是电子测量、雷达信号处理与通信基带验证的核心技术基础,其性能瓶颈常集中于采样率、通道同步性与实时处理能力。基于ADC采样原理与SoC异构架构,高带宽、低抖动时钟链路与FPGA+ARM协同处理成为突破关键。ZYNQ-7035凭借275K逻辑单元与千级DSP资源,显著提升LVDS数据流吞吐与片上滤波/触发等实时算法部署能力;HMCAD1511则以1GSPS四通道同步采样和8位分辨率,满足示波器级动态范围需求。该组合广泛应用于嵌入式信号采集平台开发、教学实验系统构建及国产化仪器原型验证。

weixin_28939623的博客 262

基于单片机的智能体重秤设计与嵌入式程序实现

智能体重秤的基本功能是测量用户的体重,并将数据通过无线方式传输到终端设备(如智能手机、电脑或云平台)进行管理。体重测量:实时测量用户体重,并进行数据存储。BMI(体质指数)计算:基于体重和身高计算BMI值,帮助用户了解健康状况。多用户管理:通过蓝牙或Wi-Fi技术支持多用户体重数据记录。健康数据分析:结合历史数据分析体重变化趋势。语音播报:通过语音播报用户体重,便于老人或视力不便的人士使用。数据同步:通过App或云平台同步数据,进行长期健康监控。

2201_76125393的博客 1756

【算法】一文带你弄懂单调栈!

本期内容主要介绍单调栈的适用场景,特性,以及作用,同时结合5道题目加深单调栈的理解。

爱编程爱运动的博客 6868

高通开发系列 - Camera之摄像头调试记录

记录一些调试内容

fulinux的博客 1217

干货!高频手撕算法合集来了

作者 |L的存在来源 |我是程序员小贱(ID:Lanj1995Q)基础数据结构的融合是成为庞大系统的基石。比如Redis中的跳跃表,数据库索引B+树等,只有对基础的数据结构足够的熟悉...

优快云资讯 3019

AI智能体丨使用Coze一键生成爆款书单视频,3个月内获赞131.1w!(附保姆级教程)

这篇教程详细介绍了如何使用扣子(Coze)平台的AI智能工作流批量制作爆款书单视频。通过自动化流程,只需1-2分钟即可生成45-50秒的书单视频,效率提升近百倍。工作流包含文案生成、音频合成、图片素材获取、视频剪辑等全流程,支持随机生成8本书单、自动提取金句、智能配音等功能。教程提供了完整的操作步骤,包括剪映草稿配置、特效添加等细节,并附体验链接和示例效果。最终生成的视频包含书单展示、金句字幕、背景音乐等元素,适合书单号运营者快速批量产出内容。

李同学Lino的博客 2354

启动launch文件时显示找不到franka_ign_ros2_control-system...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 695

腾讯 面试手撕

1.逛街 小Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。 小Q从第一栋一直走到了最后一栋,小Q从来都没有见到这么多的楼,所以他想知道他在每栋楼的位置处能看到多少栋楼呢?(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住) 输入描述 输入第一行将包含一个数字n,代表楼的栋数,接下来的一行将包含n个数字wi(1<=i<=n),代表每一栋楼的高度。 1<=n<=100000; 1<=wi<=100000; 输出描述 输出一行,包含

m0_37313888的博客 700

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【LeetCode高频手撕题 1】面试中常见的手撕算法题(hot100)

主要记录面试时高频的算法题,本篇博客算法题为hot100中的,包含解题思路与代码。

Wilber的blog。心若有所向往,又何惧道阻且长。 462

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【单调栈】单调栈基础及经典案例

整理总结单调栈的理论基础,包括应用场景、单调栈的作用、顺序以及常用变量,通过每日温度、下一个更大元素巩固单调栈,同时引入单调栈的一类经典应用场景,接雨水和柱状图中最大的矩形面积

weixin_46216674的博客 2532

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

从题目带你上手单调栈

单调栈通常用于优化某些算法的时间复杂度,尤其是在处理数组或列表问题时,它可以有效地减少不必要的比较次数。例如,在解决“下一个更大元素”问题时,单调栈可以帮助我们在线性时间内找到每个元素的下一个更大元素,而不需要对数组进行多次遍历。 在单调栈中,元素按照一定的顺序(通常是单调递增或单调递减)被压入栈中。这意味着栈内的元素从栈底到栈顶要么是严格递增的,要么是严格递减的。这种特性使得单调栈在解决一些特定问题时非常有用,比如在数组或列表中寻找下一个更大或更小的元素。

那仰望的人,心底的孤独和叹息 1098
上一篇: extern C的前世今生
下一篇: 详解多级页表与快表
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值