力扣labuladong——一刷day80

news/2024/7/20 20:03:44 标签: leetcode, 算法, java, 数据结构, 深度优先

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、力扣323.无向图中连通分量的数目
  • 二、力扣130. 被围绕的区域


前言


并查集(Union-Find)算法是一个专门针对「动态连通性」的算法,我之前写过两次,因为这个算法的考察频率高,而且它也是最小生成树算法的前置知识,所以我整合了本文,争取一篇文章把这个算法讲明白。

一、力扣323.无向图中连通分量的数目

java">class UF{
	private int[]parent;
	private int count;
	public UF(int n){
		parent = new int[n];
		count = n;
		for(int i = 0; i < n; i ++){
			parent[i] = i;
		}
	}
	public int getCount(){
		return count;
	}
	public int find(int x){
		while(parent[x] != x){
			parent[x] = find(parent[x]);
		}
		return parent[x];
	}
	public void union(int x, int y){
		int rootX = find(x);
		int rootY = find[y];
		if(rootX == rooY){
			return;
		}
		parent[rootX] = rootY;
		count --;
	}
	public boolean getConnection(int x, int y){
		int rootX = find(x);
		int rootY = find(y);
		return rootX == rootY;
	}
	public int fun(int n, int[][] edges){
		UF uf = new UF(n);
		for(int i = 0; i < n; i ++){
			union(edges[i][0], edges[i][1]);
		}
		return getCount();
	}
}

二、力扣130. 被围绕的区域

java">class Solution {
    public void solve(char[][] board) {
        int[][] arr = new int[][]{
            {0,1},
            {0,-1},
            {-1,0},
            {1,0}
        };
        if(board == null || board.length == 0){
            return;
        }
        int m = board.length;
        int n = board[0].length;
        int dummy = m * n;
        UF uf = new UF(dummy+1);
        for(int i = 0; i < m; i ++){
            if(board[i][0] == 'O'){
                uf.union(i*n,dummy);
            }
            if(board[i][n-1] == 'O'){
                uf.union(i*n+n-1,dummy);
            }
        }
        for(int i = 0; i < n; i ++){
            if(board[0][i] == 'O'){
                uf.union(i,dummy);
            }
            if(board[m-1][i] == 'O'){
                uf.union((m-1)*n+i,dummy);
            }
        }
        for(int i = 1; i < m-1; i ++){
            for(int j = 1; j < n-1; j ++){
                if(board[i][j] == 'O'){
                    for(int k = 0; k < 4; k ++){
                        int X = i + arr[k][0];
                        int Y = j + arr[k][1];
                        if(board[X][Y] == 'O'){
                            uf.union(X*n+Y,i*n+j);
                        }
                    }
                }
            }
        }
        for(int i = 0; i < m; i ++){
            for(int j = 0; j < n; j ++){
                if(board[i][j] == 'O' && !uf.getConnection(i*n+j, dummy)){
                    board[i][j] = 'X';
                }
            }
        }
    }
    class UF{
        private int count;
        private int[] parent;
        public UF(int n){
            count = n;
            parent = new int[n];
            for(int i = 0; i < n; i ++){
                parent[i] = i;
            }
        }
        public int getCount(){
            return count;
        }
        public int find(int x){
            if(parent[x] != x){
                parent[x] = find(parent[x]);
            }
            return parent[x];
        }
        public void union(int x, int y){
            int rootX = find(x);
            int rootY = find(y);
            if(rootX == rootY){
                return;
            }
            parent[rootX] = rootY;
            count --;
        }
        public boolean getConnection(int x, int y){
            int rootX = find(x);
            int rootY = find(y);
            return rootX == rootY;
        }
    }
}

http://www.niftyadmin.cn/n/5292249.html

相关文章

【C++】内存泄漏排查

前言 内存泄漏影响程序的稳定性运行&#xff0c;并且在程序运行过程中&#xff0c;并不会报错误&#xff0c;需要借助专用的内存泄露工具进行检测。 工具&#xff1a;CLion and AddressSanitizer #include <iostream> using namespace std;int main() {char *c new ch…

禁止选择当天及以后的时间

这篇文章编辑与2023.12.26&#xff0c;所以可以选择的时间为包含2023.12.25以及之前的时间 实现思路&#xff1a;1、获取当天时间的年月日&#xff0c;然后默认时分秒为23&#xff1a;59&#xff1a;59&#xff1b; 2、获取到时间转为时间戳减去 一天&#xff08;1*24*3600*10…

彻底解决VM ubuntu在虚拟机找不到网卡无法上网的问题

&#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是Zeeland&#xff0c;开源建设者与全栈领域优质创作者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 我的博客&#xff1a;Zeeland&#x1f4da; Github主页: Undertone0809 (Zeeland)&…

韩国Neowine车规认证加密芯片ALPU-CV

由工采网代理的ALPU-CV是韩国Neowine&#xff08;纽文微&#xff09;推出的一款高性能车规级加密芯片&#xff1b;也是ALPU系列中的高端IC&#xff0c;该芯片通过《AEC-Q100》认证&#xff0c;目前已经在国产前装车辆配件量产使用&#xff0c;主要用于版权license保护、设备防伪…

element el-table实现可进行横向拖拽滚动

【问题】表格横向太长&#xff0c;表格横向滚动条位于最底部&#xff0c;需将页面滚动至最底部才可左右拖动表格&#xff0c;用户体验感不好 【需求】基于elment的el-table组件生成的表格&#xff0c;使其可以横向拖拽滚动 【实现】灵感来源于这篇文章【Vue】表格可拖拽滚动&am…

2022–2023学年2021级计算机科学与技术专业数据库原理 (A)卷

一、单项选择题&#xff08;每小题1.5分&#xff0c;共30分&#xff09; 1、构成E—R模型的三个基本要素是&#xff08; B &#xff09;。 A&#xff0e;实体、属性值、关系 B&#xff0e;实体、属性、联系 C&#xff0e;实体、实体集、联系 D&#xff0e;实体、实体…

2022年第十三届中国数据库技术大会(DTCC2022)-核心PPT资料下载

一、峰会简介 本届大会以“数据智能 价值创新”为主题&#xff0c;设置2大主会场&#xff0c;20技术专场&#xff0c;邀请超百位行业专家&#xff0c;重点围绕时序数据库、图数据技术、实时数仓技术与应用实践、云原生数据库、大数据平台与数据安全等内容展开分享和探讨&#…

6.5 会话与输入事件(二)

一,键盘会话 键盘输入会话是用类型SCREEN_EVENT_KEYBOARD创建的,可以与可能生成这些类型输入事件的一个或多个设备相关联。 当输入是从键盘设备输入文本时,使用键盘会话。不使用键盘会话的SCREEN_PROPERTY_MODE 属性。 二,多点触控会话 2.1 多点触控会话 多点触控(to…