首页 > 其他分享 >Leetcode 42.接雨水

Leetcode 42.接雨水

时间:2024-02-24 17:25:55浏览次数:21  
标签:leftMax right rightMax 42 雨水 height 指针 Leetcode left

题目

image

朴素解法:

对于每列分别向左右扫描查找左右最高的柱子,对于每一个柱子接的水,那么它能接的水=min(左右两边最高柱子)-当前柱子高度。遍历每列时间复杂度为O(n),每列再扫描O(n),总共O(N^2)。

class Solution {
public:
    int trap(vector<int>& height) {
        //O(n^2)还是超时
        int ans=0;
        //按列求,只看每列能接多少水——找该列左右最高的柱子——短板效应
        for(int i=1;i<height.size();i++){
            int left = 0,right = 0;
            for(int j=0;j<i;j++)left = max(left,height[j]);
            for(int j=i+1;j<height.size();j++)right = max(right,height[j]);
            int temp = min(left,right);
            if(height[i] < temp)ans += temp-height[i];
        }
        return ans;
    }
};

动态规划:

每列都向左右扫描重复信息没有利用,考虑动态规划,用leftMax和rightMax数组记录每列的左右柱子最高高度。

  • 从左向右扫描得到leftMax:leftMax[i] = max(leftMax[i-1],height[i])
  • 从右向左扫描得到rightMax:rightMax[i] = max(rightMax[i-1],height[i])

双指针:

(实际是四指针但优化为了双指针)
动态规划中维护两个数组占用O(N)的空间,由于数组 leftMax 是从左往右计算,数组 rightMax 是从右往左计算,因此可以使用双指针和两个变量代替两个数组。

维护两个指针 left 和 right,以及两个变量 leftMax 和 rightMax,
初始时 left=0,right=n−1,leftMax=0,rightMax=0。指针 left 只会向右移动,指针 right 只会向左移动,在移动指针的过程中维护两个变量 leftMax 和 rightMax 的值。

为什么说原本是四指针

假设两柱子分别为 i,j。那么就有 iLeftMax,iRightMax,jLeftMx,jRightMax 这个变量。由于 j>i ,故 jLeftMax>=iLeftMax,iRigthMax>=jRightMax.

- 如果 iLeftMax>jRightMax,则必有 jLeftMax >= jRightMax,所以我们能接 j 点的水。
- 如果 jRightMax>iLeftMax,则必有 iRightMax >= iLeftMax,所以我们能接 i 点的水。

而上面我们实际上只用到了 iLeftMax,jRightMax 两个变量,故我们维护这两个即可。

代码

class Solution {
public:
    int trap(vector<int>& height) {
        int ans=0,left = 0,right = height.size()-1,leftMax=0,rightMax=0;
        while(left < right){
            leftMax = max(leftMax,height[left]);
            rightMax = max(rightMax,height[right]);
            if(leftMax < rightMax){
                ans += leftMax - height[left];
                left++;
            }else{
                ans += rightMax - height[right];
                right--;
            }
        }
        return ans;
    }

复杂度分析:

时间复杂度:O(n),其中 n 是数组 的长度。两个指针的移动总次数不超过 n。

空间复杂度:O(1)。只需要使用常数的额外空间。

标签:leftMax,right,rightMax,42,雨水,height,指针,Leetcode,left
From: https://www.cnblogs.com/neromegumi/p/18031309

相关文章

  • 代码随想录算法训练营day03 | leetcode 203. 移除链表元素、707. 设计链表、206. 反转
    目录题目链接:203.移除链表元素-简单题目链接:707.设计链表-中等题目链接:206.反转链表-简单题目链接:203.移除链表元素-简单题目描述:给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6......
  • UVA12421 (Jiandan) Mua (I) - Lexical Analyzer 题解
    蒟蒻的第一篇紫题题解!题目传送门思路一眼模拟,还是大模拟。不由得想起了我编了\(4\)个小时的猪国杀……输入首先处理输入,这里我们用一个字符串数组来存储所有的输入,然后再进行处理。while(getline(cin,sr))str[++cnt]=sr+'\n';处理时需要双重循环,注意如果遍历到空格要跳......
  • 【leetcode】数组篇刷题 --删除元素
    //@before-stub-for-debug-begin#include<vector>#include<string>#include"commoncppproblem27.h"usingnamespacestd;//@before-stub-for-debug-end/**@lcapp=leetcode.cnid=27lang=cpp**[27]移除元素*///@lccode=start......
  • 业界唯一单芯片自适应射频平台:XCZU42DR-L2FSVE1156I、XCZU42DR-1FFVE1156I、XCZU65DR-
    ZynqUltraScale+RFSoC是业界唯一单芯片自适应射频平台。ZynqUltraScale+RFSoC是一种异构计算架构,包括完整的Arm处理子系统、FPGA架构,以及RF信号链中的完整模数可编程性,其不仅可为不同的应用提供一个完整的单片软件定义无线电平台,而且还有助于随着市场动态的发展,生产无线......
  • 42. 接雨水C
    因为还是双指针的题目。我想到的短板效应,看两头,能接住的水也就是取决于最短的一方。每次看两头后,在里面找比最短还短的地方,那个就是有水的地方。找到水后在把它填平,防止重复找到。然后两头往中间靠就行了。intmin(inti,intj){if(i>j)returnj;returni......
  • 中百 NETAPP DS4243 存储故障盘换盘
    netapp存储出现一个故障盘,现更换故障盘。图片是已更换后正常亮灯(实际故障盘是12)首先查看多控制器的磁盘状态A控磁盘状态B控磁盘状态等磁盘确定是FAILED后即可进行换盘拔出对应的故障盘更换新的新盘(更换时建议间隔半分钟)新盘更换后,在通过diskshow-v查看磁盘属于NotOwned,还未被使......
  • 代码随想录算法训练营day02 | leetcode 977. 有序数组的平方、35.搜索插入位置、34.在
    题目链接:977.有序数组的平方-简单题目描述:给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例1:输入:nums=[-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为[16,1,0,9,100]排序后,数组变为[0,1,9,16,100]......
  • Leetcode刷题第十二天-动态规划
    1049:最后一块石头的重量II链接:1049.最后一块石头的重量II-力扣(LeetCode)1classSolution:2deflastStoneWeightII(self,stones:List[int])->int:3#dp[i]背包为i的最大价值为dp[i]4#推导公式dp[i]=max(dp[i],dp[i-stones[i]]+stones[i]......
  • # 代码随想录算法训练营day01 | leetcode 704. 二分查找、35.搜索插入位置、34.在排序
    题目链接:704.二分查找-简单题目描述:给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示......
  • Go 100 mistakes - #42: Not knowing which type of receiver to use
          ......