首页 > 其他分享 >力扣-接雨水1

力扣-接雨水1

时间:2023-07-30 15:56:28浏览次数:45  
标签:柱子 int max 高度 len height 力扣 雨水

1.问题描述

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

上面是由数组 [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.输入说明

输入若干个非负整数,以空格分隔。

3.输出说明

输出一个整数,表示结果。

4.范例

输入:

0 1 0 2 1 0 1 3 2 1 2 1

输出:

6

5.思路

备忘录优化--经典面试题:接雨水问题详解 - 知乎 (zhihu.com)

在位置 i 能接多少水,取决于该位置左边最高柱子的高度和右边最高柱子的高度,取两边中最高柱子高度的最小高度来计算接多少水,位置i最大的水柱高度为:min(l_max, r_max),接的水量为: min(l_max, r_max) - height[i] 。

开两个数组 r_max 和 l_max 充当备忘录,l_max[i] 表示位置 i 左边最高的柱子高度,r_max[i] 表示位置 i 右边最高的柱子高度。预先把这两个数组计算好,避免重复计算:

    // 从左向右计算 l_max
    for (int i = 1; i < n; i++)
        l_max[i] = max(height[i], l_max[i - 1]);
    // 从右向左计算 r_max
    for (int i = n - 2; i >= 0; i--) 
        r_max[i] = max(height[i], r_max[i + 1]);

6.代码

#include<iostream>
#include<vector>
#include<stdio.h>

using namespace std;

class Solution {
public:
    int trap(vector<int>& height)//数组首地址
    {
        if(height.empty())
            return 0;
        int len=height.size();
        int sum=0;
        int l_max[len],r_max[len];
        l_max[0]=height[0];
        r_max[len-1]=height[len-1];
        for(int i=1;i<len;i++)
        {
            l_max[i]=max(height[i],l_max[i-1]);
        }
        for(int i=len-2;i>=0;i--)
        {
            r_max[i]=max(height[i],r_max[i+1]);
        }
        for(int i=1;i<len-1;i++)
        {
            sum +=min(l_max[i],r_max[i])-height[i];
        }
        return sum;
    }
};
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int h;
    vector<int> v;
    while(cin>>h)
    {
        v.push_back(h);
    }
    int res=Solution().trap(v);
    cout<<res<<endl;
    return 0;
}

 

标签:柱子,int,max,高度,len,height,力扣,雨水
From: https://www.cnblogs.com/ohye/p/17591541.html

相关文章

  • 力扣---142. 环形链表 II
    给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。如果......
  • 力扣---6900. 统计完全子数组的数目
    给你一个由 正 整数组成的数组 nums 。如果数组中的某个子数组满足下述条件,则称之为 完全子数组 :子数组中 不同 元素的数目等于整个数组不同元素的数目。返回数组中 完全子数组 的数目。子数组 是数组中的一个连续非空序列。 示例1:输入:nums=[1,3,1,2,2]......
  • 力扣-前k个高频元素
    1.问题描述给定一个非空的整数数组,返回其中出现频率前k高的元素。示例1:输入:nums=[1,1,1,2,2,3],k=2输出:[1,2]示例2:输入:nums=[1],k=1输出:[1] 说明:你可以假设给定的k总是合理的,且1≤k≤数组中不相同的元素的个数。你的算法的时间复杂度......
  • 力扣-任务调度器
    1.问题描述给定一个用字符数组表示的CPU需要执行的任务列表。其中包含使用大写的A-Z字母表示的26种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在1个单位时间内执行完。CPU在任何一个单位时间内都可以执行一个任务,或者在待命状态。然而,两个相同种类的......
  • 代码随想录算法训练营第三天|力扣203.移除链表元素、力扣707.设计链表、力扣206.反转
    链表定义:通过指针串联在一起的线性结构,每一个节点由两个部分组成:数据域和指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null,即为空指针。链表类型1.单链表2.双链表3.循环链表,即链表首尾相连,可以解决约瑟夫环问题链表的存储方式数组在内存中是连续分布的,......
  • 力扣---77. 组合
    给定两个整数 n 和 k,返回范围 [1,n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。 示例1:输入:n=4,k=2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]示例2:输入:n=1,k=1输出:[[1]] 提示:1<=n<=201<=k<=n......
  • 算法题接雨水
    题目:给定一个长度为n的整数数组 height 。有 n 条垂线,第i条线的两个端点是 (i,0) 和 (i,height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:不能倾斜容器。设两指针i,j,指向的水槽板高度分别......
  • 力扣---141. 环形链表
    给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos 不作为参数进行传递 。仅仅是为了标......
  • 力扣-设置交集大小至少为2
    1.问题描述一个整数区间[a,b] (a<b)代表着从a到b的所有连续整数,包括a和b。给你一组整数区间intervals,请找到一个最小的集合S,使得S里的元素与区间intervals中的每一个整数区间都至少有2个元素相交。输出这个最小集合S的大小。示例1:输入:intervals=[[1......
  • 力扣---42. 接雨水
    给定 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个单位的雨水(蓝色部分表示雨水)。......