LeetCode力扣——并查集:947. 移除最多的同行或同列石头,1971. 寻找图中是否存在路径,2424. 最长上传前缀

947. 移除最多的同行或同列石头

题目描述

947. 移除最多的同行或同列石头

n 块石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。

如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。

给你一个长度为 n 的数组 stones ,其中 stones[i] = [xi, yi] 表示第 i 块石头的位置,返回 可以移除的石子 的最大数量。

运行代码

class Solution {public int removeStones(int[][] stones) {int n = stones.length;List<Integer>[] adj = new List[n];boolean[] visited = new boolean[n];for (int i = 0; i < n; i++) {adj[i] = new ArrayList<>();}for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {if (sameRowOrCol(stones[i], stones[j])) {adj[i].add(j);adj[j].add(i);}}}int remain = 0;for (int i = 0; i < n; i++) {if (!visited[i]) {remain++;explore(i, adj, visited);}}return n - remain;}private boolean sameRowOrCol(int[] a, int[] b) {return a[0] == b[0] || a[1] == b[1];}private void explore(int curr, List<Integer>[] adj, boolean[] visited) {if (visited[curr]) return;visited[curr] = true;for (int next : adj[curr]) {explore(next, adj, visited);}}
}

代码思路

一、整体功能

这段代码的目的是计算在给定二维平面上的一系列点(由整数坐标表示)中,可以移除的点的最大数量,使得剩下的点无法通过水平或垂直方向与其他点相连。

二、主要方法分析

  1. removeStones方法:

    • remain初始化为 0,用于记录最终剩下的无法通过水平或垂直方向与其他点相连的点的数量。
    • 创建一个boolean[] visited数组,用于标记每个点是否被访问过。长度也为点的总数。
    • 创建一个List<Integer>[] adj数组,用于存储每个点的相邻点列表。这个数组的长度与点的总数相同。
    • n表示输入的二维数组stones的长度,也就是点的总数。
    • 构建相邻点列表:通过两层嵌套循环遍历所有的点对。如果两个点在同一行或同一列(通过sameRowOrCol方法判断),则将它们互相添加到对方的相邻点列表中。
    • 深度优先搜索计算剩余点的数量:通过循环遍历所有的点,如果一个点没有被访问过,则将remain加一,并从这个点开始进行深度优先搜索(调用explore方法)。最后返回可以移除的点的数量,即总点数n减去剩余点的数量remain
  2. sameRowOrCol方法:接收两个点的坐标数组ab,判断这两个点是否在同一行(横坐标相同)或同一列(纵坐标相同),如果是则返回true,否则返回false

  3. explore方法:接收当前点的索引curr、相邻点列表数组adj和访问标记数组visited。如果当前点已经被访问过,则直接返回。将当前点标记为已访问。遍历当前点的相邻点列表,对每个未访问的相邻点递归调用explore方法进行深度优先搜索。

1971. 寻找图中是否存在路径

题目描述

1971. 寻找图中是否存在路径

有一个具有 n 个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] = [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接,并且没有顶点存在与自身相连的边。

请你确定是否存在从顶点 source 开始,到顶点 destination 结束的 有效路径 。

给你数组 edges 和整数 nsource 和 destination,如果从 source 到 destination 存在 有效路径 ,则返回 true,否则返回 false 。

运行代码

class Solution {public boolean validPath(int n, int[][] edges, int source, int destination) {int[] parent = new int[n];for (int i = 0; i < n; i++) {parent[i] = i;}for (int[] edge : edges) {union(edge[0], edge[1], parent);}return find(source, parent) == find(destination, parent);}private int find(int x, int[] parent) {return parent[x] == x? x : (parent[x] = find(parent[x], parent));}private void union(int x, int y, int[] parent) {int rootX = find(x, parent);int rootY = find(y, parent);if (rootX!= rootY) {parent[rootX] = rootY;}}
}

代码思路

  1. validPath方法:

    • 初始化变量:创建一个整数数组p,用于存储每个节点的父节点。这里使用了并查集的数据结构来判断节点之间的连通性。首先将数组p初始化为每个节点的父节点都是自身,表示每个节点最初都在不同的集合中。
    • 合并节点集合:遍历输入的边列表edges,对于每条边[u, v],通过调用find方法找到uv的代表元素(即所在集合的根节点),然后将其中一个代表元素的父节点设置为另一个代表元素,实现两个集合的合并。
    • 判断路径是否存在:最后,通过调用find方法找到源节点source和目标节点destination的代表元素,如果它们相同,则说明源节点和目标节点在同一个集合中,即存在一条路径连接它们,返回true;否则返回false
  2. find方法:

    • 这个方法实现了并查集中的查找操作,用于找到一个节点所在集合的代表元素(根节点)。
    • 如果一个节点的父节点就是它自己,那么它就是所在集合的代表元素,直接返回该节点。
    • 如果一个节点的父节点不是它自己,那么递归地调用find方法找到它的父节点的代表元素,并在返回之前将该节点的父节点设置为找到的代表元素,这一步叫做路径压缩,可以加快后续的查找操作。

2424. 最长上传前缀

题目描述

2424. 最长上传前缀

给你一个 n 个视频的上传序列,每个视频编号为 1 到 n 之间的 不同 数字,你需要依次将这些视频上传到服务器。请你实现一个数据结构,在上传的过程中计算 最长上传前缀 。

如果 闭区间 1 到 i 之间的视频全部都已经被上传到服务器,那么我们称 i 是上传前缀。最长上传前缀指的是符合定义的 i 中的 最大值 。

请你实现 LUPrefix 类:

  • LUPrefix(int n) 初始化一个 n 个视频的流对象。
  • void upload(int video) 上传 video 到服务器。
  • int longest() 返回上述定义的 最长上传前缀 的长度。

运行代码

class LUPrefix {private int x;private java.util.Set<Integer> s;public LUPrefix(int n) {x = 1;s = new java.util.HashSet<>();}public void upload(int video) {s.add(video);}public int longest() {while (s.contains(x)) {x++;}return x - 1;}
}

代码思路

  1. 构造函数LUPrefix(int n):初始化变量:将x初始化为 1,表示当前最长上传前缀的下一个期望视频编号。创建一个HashSet<Integer>类型的集合s,用于存储已经上传的视频编号。

  2. upload(int video)方法:功能:这个方法用于将指定编号的视频标记为已上传,即将视频编号添加到集合s中。

  3. longest()方法:

    • 循环查找:通过一个while循环,不断检查当前的x是否在集合s中。如果在集合中,说明视频编号为x的视频已经上传,此时将x的值增加 1,继续检查下一个编号。
    • 确定最长上传前缀:当x不在集合s中时,循环停止。此时x - 1就是最长上传前缀的长度。这是因为在循环停止时,x是第一个未上传的视频编号,所以最长上传前缀就是x - 1

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

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

相关文章

[Golang] Select

[Golang] Select 文章目录 [Golang] Select什么是selectselect用法基本用法空select没有default且case永久无法执行单个case和default多个case和default IO多路复用 什么是select select是Golang中一个控制结构&#xff0c;可以用来处理多个channel的发送和接收操作。select会…

Echats 实现CPK (过程能力)研究报告

背景: 实现: Echarts Option 代码示例 option {title: {text: 折线图示例 - X轴为数值},xAxis: {type: value, // X 轴改为数值型min: 0, // 最小值max: 10, // 最大值},yAxis: {type: value},series: [{type: line,data: [[0, 150], [2, 230], [4, 224], [6…

Photoshop 2021安装教程

软件介绍 Adobe Photoshop&#xff0c;简称“PS”&#xff0c;是美国Adobe公司旗下最为出名的图像处理软件系列之一。ps 2021新增一键换天空&#xff0c;AI只能滤镜&#xff0c;新增内置的画笔工具极为丰富&#xff0c;成千上万的精致像素、动态和矢量画笔可以满足你的各种绘图…

论文阅读--Planning-oriented Autonomous Driving(二)

自动驾驶框架的各种设计比较。 ( a )大多数工业解决方案针对不同的任务部署不同的模型。 ( b )多任务学习方案共享一个具有分割任务头的主干。 ( c )端到端范式将感知和预测模块统一起来。以往的尝试要么采用( c.1 )中对规划的直接优化&#xff0c;要么采用( c.2 )中的部分元…

【结构型】树形结构的应用王者,组合模式

目录 一、组合模式1、组合模式是什么&#xff1f;2、组合模式的主要参与者&#xff1a; 二、优化案例&#xff1a;文件系统1、不使用组合模式2、通过组合模式优化上面代码优化点&#xff1a; 三、使用组合模式有哪些优势1、统一接口&#xff0c;简化客户端代码2、递归结构处理方…

选址模型 | 基于混沌模拟退火粒子群优化算法的电动汽车充电站选址与定容(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于混沌模拟退火粒子群优化算法的电动汽车充电站选址与定容&#xff08;Matlab&#xff09; 问题建模&#xff1a;首先&#xff0c;需要将电动汽车充电站选址与定容问题进行数学建模&#xff0c;确定目标函数和约束…

Redis面试真题总结(一)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 什么是Redis? Redis是一个高性能的开源内存数据库系统&#xff0…

Java从入门到精通学习框架(三)

这一阶段的学习目标是将 Java 的知识从基础提升到实战开发的应用层面&#xff0c;通过对常见的 Java 企业级开发框架的学习和实践&#xff0c;掌握设计模式、分布式系统开发、性能优化等核心技能。在此基础上&#xff0c;学习并应用 Java 的高级特性和最佳实践&#xff0c;使自…

C#和数据库高级:抽象类和抽象方法

文章目录 一、为什么使用抽象类和抽象方法&#xff1f;1.1、父类与子类的相互转换 二、抽象类和抽象方法2.1、抽象类的定义和方法声明规范2.2、使用继承多态的机制解决问题 三、抽象类的概念和使用特点总结 一、为什么使用抽象类和抽象方法&#xff1f; 1.1、父类与子类的相互…

代码随想录_刷题笔记_第二次

链表 — 环形链表 题目链接&#xff1a;142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 题目要求&#xff1a; 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c…

计算机专业的就业方向

计算机专业的就业方向 亲爱的新生们&#xff0c;欢迎你们踏上计算机科学的旅程&#xff01;作为一名计算机专业的学生&#xff0c;你们即将进入一个充满无限可能的领域。今天&#xff0c;我将为大家介绍计算机专业的一些主要就业方向&#xff0c;帮助你们了解未来的职业选择。…

(黑马点评)二、短信登录功能实现

2.1 基于传统Session实现的短信登录及其校验 2.1.1 基于Session登录校验的流程设计 2.1.2 实现短信验证码发送功能 请求接口/user/code请求类型post请求参数phone返回值无 /*** 发送手机验证码*/PostMapping("/code")public Result sendCode(RequestParam("ph…

Ubunutu 的 Bash 没有颜色

终端没有颜色&#xff1a; 取消注释 force_color_promptyes &#xff1a; 这时候就有颜色了&#xff1a;

three.js shader 实现天空中白云

three.js shader 实现天空中白云 预览&#xff1a; https://threehub.cn/#/codeMirror?navigationThreeJS&classifyshader&idwhiteCloud 更多案例 可见 预览&#xff1a; https://threehub.cn import * as THREE from "three"; import { OrbitControls …

按摩上门预约小程序源码系统 在线评价+即时服务 带完整的安装代码包以及搭建部署教程

系统概述 按摩上门预约小程序源码系统是一款专为按摩行业量身定制的移动端应用解决方案。它利用先进的互联网技术&#xff0c;将传统按摩服务与线上平台相结合&#xff0c;实现了用户与服务商之间的无缝对接。该系统不仅简化了预约流程&#xff0c;提高了服务效率&#xff0c;…

【Python】探索 PluginBase:Python 插件系统的灵活构建

我承认这道菜有赌的成分&#xff0c;果然还是赌输了。 在现代软件开发中&#xff0c;插件系统为应用程序提供了极大的灵活性和扩展性。Python&#xff0c;作为一种流行的编程语言&#xff0c;拥有丰富的库和框架来支持插件的开发。今天&#xff0c;我们将深入探讨一个名为Plug…

23.面试题02.07链表相交

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode apheadA;ListNode bpheadB;int lenA0,lenB0;//求两个链表长度while(ap!null){apap.next;lenA;}while(bp!null){bpbp.next;lenB;}apheadA;bpheadB;int len0;//用来计算让…

BAS模型论文阅读

论文全名&#xff1a;Background Activation Suppression for Weakly Supervised Object Localization and Semantic Segmentation 论文pdf下载地址&#xff1a;2309.12943 (arxiv.org) 论文会议版全名&#xff1a;Background Activation Suppression for Weakly Supervised O…

AI产品经理面试20个问题汇总(含面试解题技巧、注意事项)

这题我会&#xff01;这是一个包含AI产品经理问题的备考文章&#xff0c;本文主要讲解AI产品经理的备考注意事项、真题展示、解题技巧及高效刷题方法&#xff0c;相信大家看完就一定能掌握技巧并且顺利通关&#xff01; 一、AI产品经理面试问题展示(20道) 1. 请描述一下你过…

Parallels Desktop 20(Mac虚拟机) v20.0.0 for Mac 最新破解版(支持M系列)

Parallels Desktop 20 for Mac 正式发布&#xff0c;完全支持 macOS Sequoia 和 Windows 11 24H2&#xff0c;并且在企业版中引入了全新的管理门户。 据介绍&#xff0c;新版本针对 Windows、macOS 和 Linux 虚拟机进行了大量更新&#xff0c;最大的亮点是全新推出的 Parallels…