当前位置: 首页 > news >正文

力扣每日一题打卡 684. 冗余连接

树可以看成是一个连通且 无环 的 无向 图。

给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edges[i] = [ai, bi] 表示图中在 ai 和 bi 之间存在一条边。

请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。如果有多个答案,则返回数组 edges 中最后出现的那个。

题目意思说人话就是找到一条删去后仍然联通的边。所以最简单的思路就是从后往前尝试一条条删,找到删掉之后仍然联通的边就返回。至于怎么找一个图是否联通那可太简单了,BFS,DFS,并查集啥的都可以。所以我最开始想的就是暴力用DFS去找。虽然真正写出来了才意识到这么做好像时间复杂度太高了,说不定会超时,不过写都写了就干脆写完再说。没想到交上去居然直接过了,只能说力扣的数据太水了。下面给出代码。

class Solution {
public:vector<int> findRedundantConnection(vector<vector<int>>& edges) {n = edges.size();vector<vector<bool>> ma(n + 1, vector<bool>(n + 1, false));for (auto i:edges){ma[i[0]][i[1]] = ma[i[1]][i[0]] = 1;}for (int k=n-1; k>=0; --k){vector<int> i = edges[k];ma[i[0]][i[1]] = ma[i[1]][i[0]] = 0;if (check(ma)){return i;}ma[i[0]][i[1]] = ma[i[1]][i[0]] = 1;}return edges[0];}
private:int n;bool check(vector<vector<bool>> ma){bool flag[n+1];for (int i=1; i<=n; i++) flag[i] = false;stack<int> sta;sta.push(1);flag[1] = true;while (!sta.empty()){int pt = sta.top();sta.pop();for (int i=1; i<=n; i++){if (ma[pt][i] == true){if (flag[i] == false){sta.push(i), flag[i]=true;}}}}for (int i=1; i<=n; i++){if (flag[i]==false) return false;}return true;}
};

本来我还想着超时之后就改成用邻接表去存的,按这个题的数据范围,邻接表应该是不会超时的。不过既然邻接矩阵已经过了,我也就懒得再改了。

毕竟这个题目还有更简单的方法可以实现,那就是并查集。(没学过并查集的自行百度)

思路是一条条尝试加边,判断两个点是否在同一个连通分量里面,如果在就可以直接返回这条边了,如果不在就把这条边加进去。因为题目保证只有n条边,所以这个方法找到的那条边一定是最后那条。

class Solution {
public:int find(int x){if (tree[x] != x) return find(tree[x]);return x;}void unite(int x, int y){int tx=find(x), ty=find(y);tree[tx]=ty;}vector<int> findRedundantConnection(vector<vector<int>>& edges) {const int n=edges.size();tree.clear();tree.resize(n+1);for (int i=1; i<=n; i++) tree[i]=i;for (auto i:edges){int f0=find(i[0]), f1=find(i[1]);if (f0 == f1){return i;}unite(i[0], i[1]);}return edges[0];}
private:vector<int> tree;
};

这代码甚至比用DFS还要更简洁。

因为没有进行任何优化,就连路径压缩都没做,所以这个并查集的查找时间复杂度在最坏情况下是O(n)。所以本程序的时间复杂度为O(n*n), 空间复杂度是O(n)

当然,还可以进一步使用路径压缩和按秩合并进行优化。经过优化后的并查集操作的时间复杂度是O(α(n)), α是反阿克曼函数。可以认为优化后的并查集几乎是常数时间复杂度,也就是说这题如果用优化后的并查集,时间复杂度可以看成是接近O(n)的!虽然严格来说是O(n*α(n))。优雅的并查集

相关文章:

力扣每日一题打卡 684. 冗余连接

树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1&#xff5e;n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间&#xff0c;且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges &#xff0c;edges[i] …...

什么是微服务中的反应性扩展?

大家好&#xff0c;我是锋哥。今天分享关于【什么是微服务中的反应性扩展&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 什么是微服务中的反应性扩展&#xff1f; Reactive Extensions 也称为 Rx。这是一种设计方法&#xff0c;我们通过调用多个服务来收集结果…...

【MyBatis】MyBatis-config标签详解

目录 MyBatis配置文件标签详解configuration标签properties标签typeAliases标签environments标签environment标签transactionManager标签dataSource标签mappers标签 MyBatis配置文件标签详解 我们在使用MyBatis框架的时候需要一个配置文件——MyBatis-config.xml来告诉MyBatis…...

使用AVPlayer进行音频播放开发基础设计

在使用AvPlayer进行设计之前&#xff0c;需要获取相应对象&#xff0c;后期围绕该对象展开操作 const player await media.createAVPlayer() 然后对播放器进行初始化设置&#xff1a; player.on(stateChange, (state) > {switch (state) {case initialized:player.prepar…...

API网关的作用--为什么微服务需要一个API网关?

微服务网关核心作用就是协议转换、安全隔离和流量控制 微服务架构中&#xff0c;API网关作为系统的入口点&#xff0c;可以统一处理所有客户端请求。 1&#xff09;协议转换&#xff1a;它能够支持多种通信协议&#xff08;如HTTP、gRPC等&#xff09;之间的相互转换&#xff…...

[0154].第5节:IDEA中创建Java Web工程

我的后端学习大纲 IDEA大纲 1.1.IDEA中配置Tomcat&#xff1a; 1.找打setting: 2.配置Tomcat Server的位置&#xff1a; 3.这里配置Tomcat的名称以及配置应用服务器的位置。根据自己Tomcat的安装位置决定 4.配置好后&#xff0c;如下图所示 1.2.创建Web工程&#xff1a; 1.建…...

React03 组件 Props

组件 & Props React 组件函数&#xff08; Function &#xff09;组件类&#xff08; Class &#xff09;组件 Props将 props 传递给子组件在子组件中读取 props给 prop 指定一个默认值使用 JSX 展开语法传递 props React 组件 组件本质上就是类和函数&#xff0c;但是与常…...

多线程——线程安全的集合类

目录 前言 一、多线程环境使用 ArrayList 1.进行加锁 2.使用 SynchronizedList 类 3.使用 CopyOnWriteArrayList 类 二、多线程环境使用队列 1.进行加锁 2.使用阻塞队列 三、多线程环境使用哈希表 1.Hashtable 2.ConcurrentHashMap &#xff08;1&#xff09;缩小锁…...

自动化数据库管理:如何通过存储过程动态创建 MySQL 对象

在当今数据驱动的世界中&#xff0c;高效的数据库管理至关重要。本文将展示如何通过存储过程自动化地创建各种 MySQL 数据库对象&#xff0c;包括数据表、视图、字段、索引、约束、存储过程、定时器和事件。通过这些方法&#xff0c;我们可以快速响应业务需求&#xff0c;提高数…...

480p 720p 1080p 2k 4k 8k 12k分辨率视频分别占用多大带宽?

技术背景 好多开发者&#xff0c;在设置视频编码参数的时候&#xff0c;对不同分辨率的带宽设置&#xff0c;缺乏相关的经验&#xff0c;实际上&#xff0c;视频分辨率与所需带宽之间的关系受到多个因素的影响&#xff0c;包括视频编码方式、帧率、视频内容的动态程度等。下面…...

unity中GameObject介绍

在 Unity 中&#xff0c;Cube和Sphere等基本几何体是 Unity 引擎的内置预制体&#xff08;Prefabs&#xff09;&#xff0c;它们属于 Unity 中的GameObject 系统&#xff0c;可以在 Unity 的 Hierarchy 视图或 Scene 视图中右键点击&#xff0c;然后在弹出的菜单中选择 3D Obje…...

洛谷——P8468 [Aya Round 1 C] 文文的构造游戏(01构造问题)

P8468 [Aya Round 1 C] 文文的构造游戏 题目描述 [Aya Round 1 C] 文文的构造游戏 - 洛谷 运行代码&#xff08;暴力枚举&#xff09;——超时 #include <stdio.h> #define ll long long const int N 1e6 5; // 计算数组元素的异或和 ll xorSum(ll arr[], int n) {l…...

双击热备和负载均衡的区别

区别&#xff1a; 双机热备 (heartbeat)&#xff1a;对同一应用来讲&#xff0c;永远是主机应用启动&#xff0c;备机应用停止的一主一备模式(两台通常叫双击热备&#xff0c;多台称为高可用) 负载均衡&#xff1a;两台/多台服务器 上同一个应用系统同时工作&#xff0c;分担负…...

如何使用 cPanel 部署 WordPress临时网站

对于依赖WordPress站点或WooCommerce商店的企业来说&#xff0c;在生产环境中直接修改站点风险很大。而WordPress的临时网站是一个更安全的选择&#xff0c;可以通过使用临时网站进行编辑来规避风险。 在本文中&#xff0c;我们将详细介绍WordPress临时网站的相关知识、使用临时…...

Android 自定义 Dialog 实现列表 单选,多选,搜索

前言 在Android开发中&#xff0c;通过对话框让用户选择&#xff0c;筛选信息是很方便也很常见的操作。本文详细介绍了如何使用自定义 Dialog、RecyclerView 以及自定义搜索框 来实现选中状态和用户交互&#xff0c;文中大本分代码都有明确注释&#xff0c;主打一个简单明了&a…...

下载地址合辑(持续更新)

下载地址合辑 汇总OSG相关地址Visual Studio Qt 地址qt插件安装失败 Boost库boost库编译步骤 FFmpeg 地址osg编译库 常用的下载地址&#xff1a; 汇总 vlc 地址&#xff1a; https://www.videolan.org/vlc/index.zh_CN.html visual 地址&#xff1a;https://my.visualstudio.…...

Android Kotlin 高阶函数详解及其在协程中的应用

文章目录 1. 引言2. 什么是高阶函数&#xff1f;3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda 表达式3.3 匿名函数3.4 返回函数 4. 高阶函数的深入用法4.1 函数组合4.2 内联函数4.3 高阶扩展函数 5. Kotlin 高阶函数的对比优势5.1 与 Java 的对比5.2 与 JavaScript 的…...

CSS基础—网页布局(重点!)

1、两列布局 &#xff08;1&#xff09;概念 经典两列布局是指一种网页布局方式&#xff0c;其中一列宽度固定&#xff0c;另一列宽度自适应。‌ 这种布局方式在网页设计中非常常见&#xff0c;因为它能够提供良好的视觉效果和用户体验。 如图所示&#xff1a; 页面顶部放置一…...

【Fargo】17:vs工程转qt构建:QT6 不支持32bit转向qt5.15.2

vs2022的console 工程加入qt支持后使用qt15.2 的vs2019 库,变为一个qt界面程序。最终效果 一些参考 qt5的项目搭建 qt5 最多支持到vs2019 qt6 最新 已经支持vs2022 国内还是以qt5.15为主 升级qt的vstools...

​智能电表蓝牙芯片方案

RAMSUN基于自研射频技术和基带算法提供蓝牙MCU。蓝牙MCU配套成熟的网络协议栈和丰富的示例代码及多平台APP工具。部分芯片型号无需二次开发&#xff0c;即连即用&#xff1b;提供特色蓝牙/串口/USB三通芯片&#xff0c;为更多复杂无线应用赋能。 应用案例说明: BLE方便用户直接…...

Angular 17与Firebase全栈实战:从零构建现代化Web应用

1. 项目概述&#xff1a;一个基于 Angular 17 的现代化 Web 应用最近接手并重构了一个名为 Ditectrev 的 Web 项目&#xff0c;它本质上是一个功能性的前端应用&#xff0c;旨在解决特定领域的信息展示与交互需求。这个项目最初由 Angular CLI 17.3.17 生成&#xff0c;但原始的…...

AntiDupl.NET:高效智能的重复图片检测与清理解决方案

AntiDupl.NET&#xff1a;高效智能的重复图片检测与清理解决方案 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否曾因电脑中堆积如山的重复图片而感到困扰&#…...

逆向工程实现GitHub Copilot HTTP API:解锁AI代码补全的无限集成可能

1. 项目概述&#xff1a;一个反向工程的“桥梁”如果你是一名开发者&#xff0c;并且对 GitHub Copilot 的智能代码补全能力印象深刻&#xff0c;但同时又希望能在自己偏爱的编辑器、IDE&#xff0c;甚至是命令行工具里直接调用它的能力&#xff0c;那么purocean/expose-github…...

Applite:用图形化界面轻松管理Mac软件的终极解决方案

Applite&#xff1a;用图形化界面轻松管理Mac软件的终极解决方案 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 还在为Mac上繁琐的软件管理而烦恼吗&#xff1f;Applite作为一…...

如何5分钟掌握Jump:从安装到高效使用的完整教程

如何5分钟掌握Jump&#xff1a;从安装到高效使用的完整教程 【免费下载链接】jump Jump helps you navigate faster by learning your habits. ✌️ 项目地址: https://gitcode.com/gh_mirrors/ju/jump Jump是一款能够通过学习用户习惯来加速导航的命令行工具&#xff0…...

AgentStack:构建生产级AI智能体应用的一站式平台

1. 项目概述&#xff1a;AgentStack&#xff0c;一个为AI智能体打造的“操作系统”如果你正在开发AI应用&#xff0c;或者想让你的产品具备AI能力&#xff0c;那你一定遇到过这样的困境&#xff1a;大模型能力虽强&#xff0c;但让它稳定、可控、安全地接入你的业务系统&#x…...

MATLAB仿真实战:手把手绘制LFM信号的模糊函数,看懂“斜刀刃”形状的由来

MATLAB仿真实战&#xff1a;手把手绘制LFM信号的模糊函数&#xff0c;看懂“斜刀刃”形状的由来 雷达信号处理中&#xff0c;模糊函数是理解信号分辨特性的关键工具。对于初学者而言&#xff0c;仅通过数学公式往往难以直观把握其物理意义。本文将通过MATLAB实战&#xff0c;从…...

HoRain云--PHP操作MySQL:三种创建数据库方法详解

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …...

Java反编译终极指南:JD-GUI从入门到精通完整教程

Java反编译终极指南&#xff1a;JD-GUI从入门到精通完整教程 【免费下载链接】jd-gui A standalone Java Decompiler GUI 项目地址: https://gitcode.com/gh_mirrors/jd/jd-gui Java反编译是每个Java开发者必备的核心技能&#xff0c;而JD-GUI正是这一领域的终极利器。作…...

Windows热键侦探:快速定位热键冲突的终极解决方案指南

Windows热键侦探&#xff1a;快速定位热键冲突的终极解决方案指南 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 在Window…...