法一 按列求

主要参考了@windliang的java题解,写了下C++的

42. 接雨水 - 力扣(Leetcode)

320/322个样例

超出时间限制

class Solution {
public:int trap(vector<int>& height) {int res=0;int n=height.size();for(int i=0;i<n;i++){int lmax=0,rmax=0;for(int j=0;j<i;j++)if(height[j]>lmax) lmax=height[j];for(int k=i+1;k<n;k++)if(height[k]>rmax) rmax=height[k];if(height[i]>=rmax||height[i]>=lmax)continue;res=res+(lmax>rmax ? (rmax-height[i]) : (lmax-height[i]));}return res;}
};

法二 动态规划

class Solution {
public:int trap(vector<int>& height) {int res=0;int n=height.size();vector<int> lmax_tall(n,0);vector<int> rmax_tall(n,0);for(int i=1;i<n;i++){lmax_tall[i]=max(lmax_tall[i-1],height[i-1]);}for(int j=n-2;j>=0;j--){rmax_tall[j]=max(rmax_tall[j+1],height[j+1]);}for(int k=1;k<n-1;k++){if(height[k]>=rmax_tall[k]||height[k]>=lmax_tall[k])continue;res=res+(lmax_tall[k]>rmax_tall[k] ? (rmax_tall[k]-height[k]) : (lmax_tall[k]-height[k]));}return res;}
};

需要新开两个On数组

法三 双指针

本题关键是求min的值,即在左右高度最高的值两者中取较小的

min=min(max_left,max_right)
max_left=max(left-1的高度,left-1左边最大的值)
max_right=max(right+1的高度,right+1右边最大的值)

由此画图可知已知右方有个高值时,只用考虑左边情况,左方有高值时只用考虑右边,由此用双指针遍历一次即可

时间复杂度: O(n)

空间复杂度: O(1)

class Solution {
public:int trap(vector<int>& height) {int res=0;int n=height.size();int lmax=0,rmax=0,min=0;int left=1,right=n-2;for(int i=1;i<n-1;i++){if(height[left-1]<height[right+1]){lmax=max(height[left-1],lmax);min=lmax;if(min>height[left])res+=(min-height[left]);left++;}else{rmax=max(height[right+1],rmax);min=rmax;if(min>height[right])res+=(min-height[right]);right--;}}return res;}
};

力扣42.接雨水C++解法相关推荐

  1. 力扣——42.接雨水(困难难度)——条条大路通罗马

    力扣--42.接雨水 一.算法目录合集 1.地址 2.说明 二.题目说明 1.题干 2.原地址 三.实现步骤 1.思路分析 1.1.分析问题 1.2.转化问题 1.3.简化问题 1.4.具体步骤 ① ...

  2. 力扣416 二维数组解法

    力扣416题. 动态规划的二维数组解法,虽然耗时耗空间,但是花了俩小时明白了为什么for循环不能互换,使用顺序遍历和倒叙遍历的原因,以及dp数组更迭方式.印象深刻.因为我看的书上只用了滚动数组方法,没 ...

  3. 【栈】python、单调栈解决收集雨水问题、力扣42题

    以下是leetcode 42原题: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 示例 1: 输入:height = [0,1,0,2,1,0,1 ...

  4. 力扣【接雨水问题】 leetcode-42:暴力-备忘录-双指针三种方法

    题目描述: 思路: 不要去思考整体装多少,应该去思考局部的: 去想每一个 i 的位置,最多能够装多少雨水: 这里的 i 位置最多可以装 2 雨水: 核心就是:每一个 i 位置的雨水量,都 和 i 位置 ...

  5. LeetCode(力扣)_接雨水

    最开始的笨方法: package com.yimu.test;//给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. // 示例 1: //输入:hei ...

  6. Leet Code 力扣 - - 最短最优雅python解法带解析汇总

    Leet Code 刷题笔记 - - 不求最快最省,但求最短最优雅 前言 代码精炼是 Python 的核心,同时能够反应对于语言的熟练程度,本项目目的在于汇总 leet code 最短最优雅的解法,拒 ...

  7. 力扣 -----最小绝对值(JavaScript解法)

    一.题目描述 二.示例 三.解题思路 先进行一个排序,然后使用双指针,依次进行比较,将比较的值进行存储,最小值改变的话,数组置空,最小值改变,如果和最小值相等的话直接push.我刚开始写的排序是 四. ...

  8. 力扣刷题记录-单调栈相关题目

    单调栈是指栈里的元素保持升序或者降序. 判别是否需要使用单调栈:通常是一维数组里面,需要寻找一个元素左边或者右边第一个比自己大或者小的元素的位置,则可以考虑使用单调栈:这样的时间复杂度一般为O(n). ...

  9. 力扣739. 每日温度

    739. 每日温度 - 力扣(LeetCode) (leetcode-cn.com) 暴力 class Solution {public int[] dailyTemperatures(int[] t ...

  10. 20210119:力扣第42周双周赛(下)

    力扣第42周双周赛(下) 题目 思路与算法 代码实现 写在最后 题目 修改后的最大二进制字符串 得到连续 K 个 1 的最少相邻交换次数 思路与算法 修改后的最大二进制字符串 这道题的思路很简单,交换 ...

最新文章

  1. AutoCloseable的用法
  2. switch与if效率实例解析·5年以下编程经验必看【C#】
  3. kata_小规模流处理kata。 第2部分:RxJava 1.x / 2.x
  4. hive避免MR的情况
  5. 4.4.1 数据赋值
  6. 花匠(NOIP2013)(神奇纯模拟)
  7. QQ资料清空php源码,清除QQ账号所有授权应用 JavaScript代码
  8. 图形变换之旋转变换公式推导
  9. logback配置详解
  10. ENVI5.3.1使用Landsat 8影像进行辐射定标和大气校正实例操作
  11. 2022年前端技术发展趋势
  12. Android Studio 错误记录:If you already have a 64-bit JDK installed ,defined a JAVA_HOME variable..
  13. 举个栗子!Tableau技巧(6):妙用Index函数来改变数据排序
  14. Android平台根据分辨率计算屏幕尺寸
  15. 《自控力》第五章读书笔记
  16. Unity的摄像机拉近拉远和旋转脚本实现
  17. 罗永浩直播卖货,体现了一个年近50岁男人的无奈
  18. 如何开通公众号留言功能?
  19. 我的idea偏好设置
  20. PMP|研发项目管理之问题及改进方法

热门文章

  1. pacman使用教程,官方文档中文版
  2. 金蝶中间件中标国家金质工程
  3. 详解电脑怎么截图按什么键
  4. c# 阿拉伯数字转成中文
  5. 用java做出长方体的表面积_计算长方体、四棱锥的表面积和体积(Java)acm.sdut...
  6. P4234 最小差值生成树
  7. 论治理与创新,2022 开放原子全球开源峰会 OpenAnolis 分论坛圆满落幕
  8. 发生内部错误。请与 microsoft 支持部门联系。_设计变更、工程签证、确认单、工程洽商、联系单、会签的是干啥的?有啥区别?...
  9. 贝叶斯和EM算法简介
  10. jboss mysql cluster_jboss之mod_cluster集群