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

力扣-接雨水2

时间:2023-07-31 22:33:45浏览次数:41  
标签:int 元素 雨水 height 力扣 maxH que &&

1.问题描述

给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。

示例:

给出如下 3x6 的高度图:

[

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

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

  [2,3,3,2,3,1]

]

返回 4 。

如下图所示,这是下雨前的高度图[[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] 的状态。

下雨后,雨水将会被存储在这些方块中。总的接雨水量是4。

说明:

  • 1 <= m, n <= 110

  • 0 <= heightMap[i][j] <= 20000

2.输入说明

首先输入高度图的行列数m和n

然后输入m行,每行n个非负整数,表示heightMap的元素值,以空格分隔。

  • 1 <= m, n <= 110

  • 0 <= heightMap[i][j] <= 20000

3.输出说明

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

4.范例

输入:

3 6
1 4 3 1 3 2
3 2 1 3 2 4
2 3 3 2 3 1

输出:

4

5.思路

代码链接:https://leetcode.cn/problems/trapping-rain-water-ii/solution/cong-1djie-yu-shui-dao-2djie-yu-shui-si-i130l/

链接的大佬写的思路很清晰,结合视频进行学习。

 

6.代码

#include<iostream>
#include<queue>
#include<vector>

using namespace std;

class Solution {
public:
    int trapRainWater(vector<vector<int> >& height)
    {
        int n = height.size(), m = height[0].size();//n为行,m为列
        priority_queue<pair<int,int>, vector<pair<int,int> >, greater<pair<int,int> > > que;//构造最小堆
        for(int i = 0; i < n; ++i)
        {
            for(int j = 0; j < m; ++j)
            {
                if(i == 0 || j == 0 || i == n-1 || j == m-1)
                {
                    que.push({height[i][j], i*m + j});
                    height[i][j] = -1;
                }
            }
        }

        int x[4] = {0, 0, 1, -1}, y[4] = {1, -1, 0, 0};//表示查找当前元素上下右左四边是否有元素没有入堆,若有,不操作,若无,入堆

        int ans = 0, maxH = INT_MIN;//C++中常量INT_MAX和INT_MIN分别表示最大、最小整数,定义在头文件limits.h中
        while(!que.empty())
        {
            const auto& cur = que.top();//获取最小堆的最小元素
            int h = cur.first, i = cur.second/m, j = cur.second%m; //i和j表示当前元素的位置
            que.pop();
            if(h > maxH) maxH = h;
            for(int k = 0; k < 4; ++k)
            {
                i += x[k], j += y[k];//依次寻找当前元素的上下右左的元素是否入堆,并且检查该元素是否比maxH小,若小,则可以接雨水
                if(i >= 0 && i < n && j >= 0 && j < m && height[i][j] != -1)
                {
                    que.push({height[i][j], i*m + j});
                    if(height[i][j] < maxH) ans += maxH - height[i][j];
                    height[i][j] = -1;
                }
                i -= x[k], j -= y[k];//与上面的i和j返回原来的位置,即还是当前元素的位置,以便循环中查找下一个位置
            }
        }
        return ans;
    }
};

int main()
{
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    int m, n,data;
    vector<vector<int> > heights;
    cin>>m>>n;
    for(int i=0; i<m; i++)
    {
        vector<int> row;
        for(int j=0; j<n; j++)
        {
            cin>>data;
            row.push_back(data);
        }
        heights.push_back(row);
    }

    int res=Solution().trapRainWater(heights);
    cout<<res<<endl;
    return 0;
}

 

标签:int,元素,雨水,height,力扣,maxH,que,&&
From: https://www.cnblogs.com/ohye/p/17594980.html

相关文章

  • 代码随想录第四天|力扣24.两两交换链表节点、力扣19.删除链表的倒数第N个结点、力扣面
    两两交换链表中的节点(力扣24.)dummyhead.next=head;cur=dummyhead;while(cur.next!=null&&cur.next.next!=null)temp=cur.next;temp1=cur.next.next.next;cur.next=cur.next.next;cur.next.next=temp;temp.next=temp1;cur=cur.next.next;returndummyhead.n......
  • 力扣-接雨水1
    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]输出:62.输入说明输入......
  • 力扣---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 不作为参数进行传递 。仅仅是为了标......