基本算法学习记录---Day2

news2024/11/28 8:47:18

并查集模板1

class Solution {
    int[] root = new int[200000];
    public int Que() {
    	//初始化
        for(int i = 1;i<=n;i++){
            root[i] = i;
        }
        //TODO
    }
    //找根(将节点连接)
    public int find(int x){
        if(root[x] != x){
            root[x] = find(root[x]);
        }
        return root[x];
    }
    //合并
    public void heb(int i,int j){
        root[find(i)] = find(j);
    }
}

并查集模板2(按秩合并)

前置知识:**按秩合并——主要是针对heb函数**,在合并两个集合时,将秩大的根节点设置为秩小的根节点的父节点。意思是当要合并两个根节点A、B时,如果节点A的秩大于节点B的秩,那么将节点A设置为节点B的父节点,反之亦然。
按秩合并可以最小化树的深度。

class Solution {
    int[] root = new int[100001];//根
    int[] rank = new int[100001];//秩
    //TODO
    /*其他参数(可记录:
    				1.合并完后的总连通分量数n-minusCount)
    				2.制造出环的边的数量superfluousCount
    				3.每个连通分量中的节点数量size
    				4.每个连通分量中的边权值和weight
    */  
    public int Que(int n//n个节点) {
    	//初始化
        for(int i = 0;i<n;i++){//
            root[i] = i;
        }
        //TODO
    }
    //找根(将节点连接)
    public int find(int x){
        if(root[x] != x){
            root[x] = find(root[x]);
        }
        return root[x];
    }
    //合并
    public void heb(int i,int j){
        int rootA = find(i);
        int rootB = find(j);
        if(rootA != rootB){
        	//按秩合并
            if(rank[rootA] < rank[rootB]){
                int temp = rootA;
                rootA = rootB;
                rootB = temp;
            }
            root[rootB] = rootA;
            if (rank[rootA] == rank[rootB]){
                rank[rootA] += 1;
            }
            //TODO
        }else{
            //TODO
        }
    }
}

tip:无向图考虑并查集 ,有向图考虑深度广度优先、拓扑排序。


leetcode上比较经典的题有:547. 省份数量、684. 冗余连接、1319. 连通网络的操作次数、1971. 寻找图中是否存在路径(未完待续…)

547. 省份数量——求连通分量的数量(可直接套模板1)

有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市
c 间接相连。

省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。

给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。
返回矩阵中 省份 的数量。
示例 1:
在这里插入图片描述
输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2

代码

class Solution {
    int[] root = new int[205];
    public int findCircleNum(int[][] isConnected) {
        int n = isConnected.length;
        for(int i = 1;i<=n;i++){
            root[i] = i;
        }
        for(int i = 0;i<n;i++){
            for(int j = 0;j<n;j++){
                if(isConnected[i][j] == 1 && i != j){
                    heb(i+1,j+1);
                }
            }
        }
        int ans = 0;
        for(int i = 1;i<=n;i++){
            if(root[i] == i){
                ans++;
            }
        }
        return ans;
    }
    public int find(int x){
        if(root[x] != x){
            root[x] = find(root[x]);
        }
        return root[x];
    }
    public void heb(int i,int j){
        root[find(i)] = find(j);
    }
}

1319. 连通网络的操作次数(需要对模板进行优化——按秩合并,套模板2)

用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。
网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。
给你这个计算机网络的初始布线 connections,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连的计算机。请你计算并返回使所有计算机都连通所需的最少操作次数。如果不可能,则返回 -1
示例 1:
在这里插入图片描述
输入:n = 4, connections = [[0,1],[0,2],[1,2]]
输出:1
解释:拔下计算机 1 和 2 之间的线缆,并将它插到计算机 1 和 3 上。

前置知识:
1.存在N个节点M条边,被边直接或间接相连的所有节点共同形成一个域,称为连通域,连通域也称为连通分量
2.若有K个连通分量,则最少需要K-1条边才能将K个连通分量合并成1个连通分量

代码

class Solution {
    int[] root = new int[100001];//根
    int[] rank = new int[100001];//秩
    int superfluousCount = 0;//多余的边(制造出环的边)
    
    int minusCount = 0;//记录减去的连通分量的数目   
    public int makeConnected(int n, int[][] connections) {
        int len = connections.length;
        for(int i = 0;i<n;i++){
            root[i] = i;
        }
        for(int i = 0;i<len;i++){
            heb(connections[i][0],connections[i][1]);
        }
        //(n-minusCount即为剩余的连通分量的个数)
        if(superfluousCount < n-minusCount-1){//此时不能使所有计算机都连通
            return -1;
        }
        //n个连通分量连成一个需要n-1条边
        return n-minusCount-1;
    }
    public int find(int x){
        if(root[x] != x){
            root[x] = find(root[x]);
        }
        return root[x];
    }
    public void heb(int i,int j){
        int rootA = find(i);
        int rootB = find(j);
        if(rootA != rootB){//不是多余连接的情况(即没有环)
        	//按秩合并
            if(rank[rootA] < rank[rootB]){
                int temp = rootA;
                rootA = rootB;
                rootB = temp;
            }
            root[rootB] = rootA;
            if (rank[rootA] == rank[rootB]){
                rank[rootA] += 1;
            }
            //每合并一次则令减去的连通分量的数目+1
            minusCount++;
        }else{//是多余连接的情况(即形成环)
            //此时记录多余的边
            superfluousCount++;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速突出重点数据,条件样式来帮你

使用条件样式可以实现使用样式标注符合规则的数据&#xff0c;可以帮助直观查看数据、发现关键数据问题和数据的变化趋势。例如&#xff1a; 使用红色文字标注同比增幅小于10%的省份 使用红色文字标注同比增幅小于10%的省份使用不同的图标标注计划完成情况&#xff0c;绿色图…

PS CS6视频剪辑基本技巧(一)CS6可以实现的视频剪辑功能

前几天儿子要做一个居家生活的视频在班会上分享&#xff0c;想把视频做得漂亮一些&#xff0c;不想应付了事&#xff0c;本人略懂PS&#xff0c;所以就地取材学了一下用PS CS6制作视频&#xff0c;现在把学习到的基本技巧给大家分享一下。本人非专业人士&#xff0c;所用软件也…

Arthas入门和安装使用

闲聊 我前几天也阳了&#xff0c;难受的要死&#xff0c; 不过今天明显好转&#xff0c;抓紧来一篇博文助助兴。如果对你有一点收获&#xff0c;辛苦点个赞。 简介 Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持JDK6以上。主要用于定位和诊断线上程序运行问…

Solidity之abi.encode各编码方法使用

什么是智能合约 ABI ABI Specification for encoding and decoding 非常精炼的一句话&#xff1a;一套用来编码和解码的规范。 注意与合约字节码&#xff08;bytecode&#xff09;要区分开&#xff0c;字节码只是一串用十六进制数表示的 EVM 操作码。 在 Solidity 文档中描…

文件内容的读写 (IO) —— 数据流

文件内容的读写 IO —— 数据流一、什么是数据流二、字节流输入InputStream2.1 InputStream 概述2.2 FileInputStream 的使用三、字节流输出OutputStream3.1 OutputStream 概述3.2 FileOutputStream 的使用四、字符流输入 Reader4.1 Reader 与 FileReader4.2 利用 Scanner 进行…

[Java]图论进阶--最小生成树算法

专栏简介 :MySql数据库从入门到进阶. 题目来源:leetcode,牛客,剑指offer. 创作目标:记录学习MySql学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 1. 最小生成树 1.1 Kruskal(克鲁斯卡尔) 算法 …

计算机毕设Python+Vue校园社团信息管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Teams app LukcyDraw 的升级之路

我已经有很长一段时间没有更新我的 Teams App&#xff1a;LuckyDraw 了&#xff0c;有很多用户反馈给我&#xff0c;因为快到圣诞&#xff0c;新年和春节了&#xff0c;很多公司都开始要使用LuckyDraw来搞抽奖活动&#xff0c;希望LuckyDraw能支持大用户量的抽奖&#xff0c;所…

当打造一款极速湖分析产品时,我们在想些什么

作者&#xff1a;王有卓&#xff0c;StarRocks Contributor 随着开源数据湖技术的快速发展以及湖仓一体全新架构的提出&#xff0c;传统数据湖在事务处理、流式计算以及数据科学场景的限制逐渐得以优化解决。 为了满足用户对数据湖探索分析的需求&#xff0c;StarRocks 在 2.…

jsp+ssm计算机毕业设计ssm实验教学资源管理系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

【linux】linux实操篇之进程管理

目录前言进程介绍和查询进程基本介绍显示系统执行的进程终止进程服务管理监控服务动态监控进程监控网络状态结语前言 本篇博客总结linux中的进程管理相关知识&#xff0c;主要有进程介绍&#xff0c;终止进程&#xff0c;服务管理以及监控服务&#xff0c;一起来看看吧&#x…

模拟电路设计(40)---你真的懂“接地”吗?

概念 接地是指将一个电路、设备乃至分系统与一个基准“地”电位连接的电气要求&#xff0c;目的在于提供一个等电位点或等电位面。接地可以接真正的大地&#xff0c;也可以不接&#xff0c;例如飞机上的电子电气设备接飞机机壳就是接地。 接地必须有接地导体和接地平面才能够…

ChatGPT和InstructGPT 对比,ChatGPT将改变世界,影响力不亚于2007年新一代iPhone智能手机的发布

ChatGPT ChatGPT 的模型&#xff0c;它以对话方式进行交互。对话格式使 ChatGPT 可以回答后续问题、承认错误、挑战不正确的前提并拒绝不适当的请求。ChatGPT 是InstructGPT的兄弟模型&#xff0c;它经过训练可以按照提示中的说明进行操作并提供详细的响应。 ChatGPT 网址&am…

vue打包优化一

webpack.dll.config.js配置 相关文章 https://www.cnblogs.com/echoyya/p/16413591.html 步骤一&#xff1a;创建webpack.dll.config.js&#xff08;不一定要是这个名字&#xff0c;只要执行指令的时候路径正确就行&#xff09; // webpack.dll.config.js const path requi…

FIX:FusionCharts Suite XT 3.19.x

FusionCharts Suite XT&#xff1a;探索 100 多张图表和 2000 多张地图 FusionCharts 提供了 100 多张图表和 2000 多张地图。凭借广泛的文档、一致的 API 和一系列自定义选项 - FusionCharts 是最全面的 JavaScript 图表库&#xff0c;受到全球 750,000 名开发人员的喜爱。Fus…

JAVA实训第四天

目录 异常 什么是异常&#xff1f; 为什么要进行异常处理&#xff1f; 方法的调用堆栈 方法调用堆栈中异常对象的传递 Java中的异常类 常见的异常类 常见的异常类及出现此异常的原因 •1、java.lang.NullpointerException(空指针异常) •2、 java.lang.ClassNotFoundExcept…

rocketmq源码-broker接收消息

前言 这篇笔记&#xff0c;主要记录producer在通过netty发送了请求之后&#xff0c;在broker这边是如何处理的消息的 org.apache.rocketmq.remoting.netty.NettyRemotingServer.NettyServerHandler#channelRead0 这里是broker的nettyServer端接收客户端发送消息的入口&#x…

Android中GRPC的使用-4种通信模式

GRPC的通信模式 GRPC四种基础通信模式&#xff1a;一元RPC、服务器端流RPC、客户端流RPC以及双向流RPC。下面分别四种模式进行介绍&#xff0c;并在Android环境中来实现服务和客户端。 一元RPC 一元RPC模式也被称为简单RPC模式。在该模式中&#xff0c;当客户端调用服务端的远程…

破记录!国产数据库KunDB 单节点TPC-C事务性能超180万tpmC

近日&#xff0c;星环科技KunDB在TPC-C事务性能测试中&#xff0c;采用常规国产服务器&#xff0c;实现了单节点tpmC超180万&#xff0c;体现其世界级领先的事务处理能力。 TPC-C是全球 OLTP 数据库最权威的性能测试基准&#xff0c;由TPC组织&#xff08;国际事务性能委员会&…

【数字IC基础】TestBench功能

文章目录 一、TestBench的目的?二、TestBench的功能?三、TestBench(验证)的四要素?一、TestBench的目的? 对使用硬件描述语言(HDL)设计的电路(DUT)进行仿真验证,测试设计电路的功能、部分性能是否符合预期二、TestBench的功能? TestBench和DUT的关系是一个马蹄形结…