首页 > 其他分享 >1020.飞地的数量 (Medium)

1020.飞地的数量 (Medium)

时间:2023-06-14 09:25:09浏览次数:48  
标签:cnt Medium 1020 飞地 siz par int grid new

问题描述

1020. 飞地的数量 (Medium)

给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、 1 表示一个陆地单元格。

一次 移动 是指从一个陆地单元格走到另一个相邻( 上、下、左、右)的陆地单元格或跨过 grid 的边界。

返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。

示例 1:

输入:grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
输出:3
解释:有三个 1 被 0 包围。一个 1 没有被包围,因为它在边界上。

示例 2:

输入:grid = [[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]]
输出:0
解释:所有 1 都在边界上或可以到达边界。

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 500
  • grid[i][j] 的值为 01

解题思路

使用并查集,令cnt1为包含索引为m * n的节点树的节点数,cnt2为海水的节点数,res = m * n - (cnt1 - 1) - cnt2;

代码

struct Dsu {
    vector<int> par_;
    vector<int> siz_;
    int cnt_;
    explicit Dsu(int cnt) :
        par_(cnt + 1), siz_(cnt + 1, 1), cnt_(cnt) {
        for (int i = 0; i <= cnt; ++i) {
            par_[i] = i;
        }
    };
    auto find(int x) -> int {
        return par_[x] == x ? x : (par_[x] = find(par_[x]));
    }
    void uni(int x, int y) {
        x = find(x), y = find(y);
        if (x == y) {
            return;
        }
        if (siz_[x] < siz_[y]) {
            std::swap(x, y);
        }
        par_[y] = x;
        siz_[x] += siz_[y];
        --cnt_;
    }
};
class Solution {
  public:
    int numEnclaves(vector<vector<int>> &grid) {
        // 并查集
        int m = grid.size(), n = grid[0].size();
        vector<vector<int>> move{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        Dsu dsu(m * n);
        int cnt = 0;
        for (int i = 0; i < m * n; ++i) {
            int x = i / n, y = i % n;
            if (grid[x][y] == 1) {
                if (x == m - 1 || x == 0 || y == 0 || y == n - 1) {
                    dsu.uni(i, m * n);
                }
                for (int j = 0; j < 4; ++j) {
                    int x_new = x + move[j][0], y_new = y + move[j][1];
                    if (x_new < 0 || x_new >= m || y_new < 0 || y_new >= n || grid[x_new][y_new] == 0) {
                        continue;
                    }
                    dsu.uni(i, x_new * n + y_new);
                }
            } else {
                ++cnt;
            }
        }
        return m * n - dsu.siz_[dsu.find(m * n)] - cnt + 1;
    }
};

标签:cnt,Medium,1020,飞地,siz,par,int,grid,new
From: https://www.cnblogs.com/zwyyy456/p/17479215.html

相关文章

  • 442.数组中重复的数据 (Medium)
    问题描述442.数组中重复的数据(Medium)给你一个长度为n的整数数组nums,其中nums的所有整数都在范围[1,n]内,且每个整数出现一次或两次。请你找出所有出现两次的整数,并以数组形式返回。你必须设计并实现一个时间复杂度为O(n)且仅使用常量额外空间的算法解决此......
  • 面试题 17.05. 字母与数字 (Medium)
    问题描述面试题17.05.字母与数字(Medium)给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。返回该子数组,若存在多个最长子数组,返回左端点下标值最小的子数组。若不存在这样的数组,返回一个空数组。示例1:输入:["A","1","B","C","D","2","3",......
  • 1631.最小体力消耗路径 (Medium)
    问题描述1631.最小体力消耗路径(Medium)你准备参加一场远足活动。给你一个二维rowsxcolumns的地图heights,其中heights[row][col]表示格子(row,col)的高度。一开始你在最左上角的格子(0,0),且你希望去最右下角的格子(rows-1,columns-1)(注意下标从0开始编号)。......
  • 795.区间子数组个数 (Medium)
    问题描述795.区间子数组个数(Medium)给你一个整数数组nums和两个整数:left及right。找出nums中连续、非空且其中最大元素在范围[left,right]内的子数组,并返回满足条件的子数组的个数。生成的测试用例保证结果符合32-bit整数范围。示例1:输入:nums=[2,1,4,3],......
  • 802.找到最终的安全状态 (Medium)
    问题描述802.找到最终的安全状态(Medium)有一个有n个节点的有向图,节点按0到n-1编号。图由一个索引从0开始的2D整数数组graph表示,graph[i]是与节点i相邻的节点的整数数组,这意味着从节点i到graph[i]中的每个节点都有一条边。如果一个节点没有连出的有......
  • 2718. 查询后矩阵的和 (Medium)
    问题描述2718.查询后矩阵的和(Medium)给你一个整数n和一个下标从0开始的二维数组queries,其中queries[i]=[typeᵢ,indexᵢ,valᵢ]。一开始,给你一个下标从0开始的nxn矩阵,所有元素均为0。每一个查询,你需要执行以下操作之一:如果typeᵢ==0,将第index......
  • 28.找出字符串中第一个匹配项的下标 (Medium)
    问题描述28.找出字符串中第一个匹配项的下标(Medium)给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。示例1:输入:haystack="sadbutsad",needle="sad......
  • 373. 查找和最小的 K 对数字 (Medium)
    问题描述373.查找和最小的K对数字(Medium)给定两个以升序排列的整数数组nums1和nums2,以及一个整数k。定义一对值(u,v),其中第一个元素来自nums1,第二个元素来自nums2。请找到和最小的k个数对(u₁,v₁),(u₂,v₂)...(uₖ,vₖ)。示例1:输入:nums1......
  • hackthebox sniper medium
    主机发现nmap--min-rate1000-p-10.10.10.151发现80和445端口端口探测首先利用smbclient进行端口探测smbclient-L//10.10.10.151连接错误(后面发现是因为本地smb配置错误导致的)切换方向访问80端口发现是一个类似博客的页面鼠标悬浮可以查看到左下角的悬浮跳......
  • hackthebox --interface medium
    主机发现nmap-sV-sC-O-p22,8010.10.11.200-oNports 访问80页面,主页面是这样的 再访问一下index.php或者index.html发现是404错误,有可能是里面隐藏了一些api我们可以查看到搜索看看有没有类似的api泄露利用f12查看js源码搜索http://或者/或者/upload这里......