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

并查集:Leetcode765 情侣牵手

n 对情侣坐在连续排列的 2n 个座位上,想要牵到对方的手。

人和座位由一个整数数组 row 表示,其中 row[i] 是坐在第 i 个座位上的人的 ID。情侣们按顺序编号,第一对是 (0, 1),第二对是 (2, 3),以此类推,最后一对是 (2n-2, 2n-1)

返回 最少交换座位的次数,以便每对情侣可以并肩坐在一起。 每次交换可选择任意两人,让他们站起来交换座位。

示例 1:

输入: row = [0,2,1,3]
输出: 1
解释: 只需要交换row[1]和row[2]的位置即可。

示例 2:

输入: row = [3,2,0,1]
输出: 0
解释: 无需交换座位,所有的情侣都已经可以手牵手了。

题解:把2n个作为分为n个组,每个组最后做一对情侣,由题可得 编号/2 相同的人是一对情侣。

如果把一对情侣看成一个点,把一个座位看成一条边,可以把输入转化成一个图。[0,2,1,3] 转化为情侣:[0 1 0 1]。

所以01之间形成一个环。

经过枚举,可以发现形成的图是一个或几个环。最终的结果是要变成n-1个自环。

规律:

如果每个座位内交换两个人位置,那么环的个数不变。

如果不同座位内交换两个人位置,那么环的个数加1。

所以只要求一开始的环的个数即可。

使用并查集来求图中环的个数(因为图中只有环?)

初始化每对情侣都指向自己。?

??

class Solution {
public:vector<int> p;int find(int x){if(p[x]!=x)p[x]=find(p[x]);return p[x];}int minSwapsCouples(vector<int>& row) {int n = row.size()/2;for(int i = 0;i < n;i++) p.push_back(i);int cnt = 0;for(int i = 0;i<n*2;i+=2){int a = row[i]/2;int b = row[i+1]/2;if(find(a)!=find(b)){p[find(a)]=find(b);cnt++;}}return cnt;}
};

http://www.lryc.cn/news/225851.html

相关文章:

  • 如何设计一个网盘系统的架构
  • 【代码随想录】算法训练计划17
  • “护肤品销售策略:从“免费拼团”到“3人回本大放送”“
  • uniapp和vue3+ts开发小程序,使用vscode提示声明变量冲突解决办法
  • CCLink转Modbus TCP网关_MODBUS报文配置
  • 【开源】基于Vue.js的大学兼职教师管理系统的设计和实现
  • Mysql数据库 14.SQL语言 视图
  • 【Acwing171】送礼物(双向dfs)题解
  • 机器学习---多分类SVM、支持向量机分类
  • 玩转Linux基本指令
  • 【开源分享】国内可用的免费安卓GPT语音助手 - 可音量键唤起,可联网
  • 什么是安全平行切面
  • Git 入门使用 —— 建库、代码上下传、常用命令
  • HTML5学习系列之简单使用1
  • 计算机网络第一章(计算机网络开篇)
  • 百度秋招突击手册面试算法题:三数之和
  • 归并排序 图解 递归 + 非递归 + 笔记
  • 2023 年最好的 Android 系统修复/刷机应用程序和软件
  • Linux下内网穿透实现云原生观测分析工具的远程访问
  • 卡数据兼容性要求-M2M架构
  • C++入门篇3(类和对象【重点】)
  • 【开源】基于Vue.js的生活废品回收系统的设计和实现
  • Mysql配置主从复制-GTID模式
  • Flink之状态管理
  • [Mac软件]Adobe Media Encoder 2024 V24.0.2免激活版
  • Bytebase 2.11.0 - 支持 OceanBase Oracle 模式
  • 『CV学习笔记』文本识别算法CRNNSVTR介绍
  • HaaS510开板式DTU真机连云:上报监测数据至阿里云物联网平台
  • 贾扬清开源 AI 框架 Caffe | 开源英雄
  • 【objectarx.net】使用公式自动更新表格项的内容