首页 > 其他分享 >情侣牵手

情侣牵手

时间:2023-05-15 17:22:08浏览次数:49  
标签:int 情侣 find vector 牵手 节点 row

n 对情侣坐在连续排列的 2n 个座位上,想要牵到对方的手。
人和座位由一个整数数组 row 表示,其中 row[i] 是坐在第 i 个座位上的人的 ID。情侣们按顺序编号,第一对是 (0, 1),第二对是 (2, 3),以此类推,最后一对是 (2n-2, 2n-1)。
返回最少交换座位的次数,以便每对情侣可以并肩坐在一起。 每次交换可选择任意两人,让他们站起来交换座位。

1. 贪心+哈希

对于按顺序编号并配对的问题,可以考虑用图的思维来思考
把人两两归到一起,看做一个节点,一对情侣关系看做一条边,每个节点存在两条边,原数组可以抽象成不同节点连成的多个环
不过我们可以先用贪心的思想来做,每次使得一对情侣坐到一起,其实从图的角度来看,就是将环中的两个节点中合并并释放掉了一对情侣

class Solution {
public:
    int minSwapsCouples(vector<int>& row) {
        int n = row.size();
        int count = 0;
        map<int,int> m;//对应值的位置,后面还要用于交换位置
        for(int i=0;i<n;i++)
            m[row[i]] = i;
        for(int i=0;i<n;i=i+2){
            int first = row[i];
            int couple = first^1;
            int index = m[couple];
            if(index/2==i/2) continue;//位于同一块
            //否则要将first 的老婆位置与i+1对换
            m[row[i+1]] = index;
            swap(row[i+1],row[index]);
            count++;
        }
        return count;
    }
};

2. 图+哈希

节点数n/2 - 环的个数等于最终结果,即需要释放情侣的次数

class Solution {
public:
    int minSwapsCouples(vector<int>& row) {
        int n = row.size();
        int count = 0;
        map<int,int> m;//对应值的位置
        vector<bool> visit(n/2);
        for(int i=0;i<n;i++)
            m[row[i]] = i;
        for(int i=0;i<n;i=i+2){
            if(visit[i/2]) continue;
            int index = i;
            while(!visit[index/2]){ //遍历当前环的循环,下一个没访问过
                visit[index/2] = true;
                int nei_index = index^1;//得到邻居下标
                int neibor = row[nei_index];
                int couple = neibor^1;//得到邻居的老婆
                index = m[couple];//转移到邻居老婆对应的节点
            }
            count++;//环个数加一
        }
        return n/2-count;
    }
};

3. 并查集

跟方法二思路差不多,只不过用模板,合并更为方便
把相邻两数所在的节点合并

class Solution {
public:
    vector<int> p;
    void union_(int a, int b) {
        p[find(a)] = p[find(b)];
    }
    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();
        int m = n/2;
        int count = 0;
        p.resize(m);//初始节点个数
        for(int i =0;i<m;i++)//初始化节点集合
            p[i] = i;
        for(int i=0;i<n;i=i+2)
            union_(row[i]/2,row[i+1]/2);//合并两节点
        for(int i=0;i<m;i++)
            if(find(i)==i) count++;//集合个数,即环个数
        return m-count;
    }
};

标签:int,情侣,find,vector,牵手,节点,row
From: https://www.cnblogs.com/929code/p/17402529.html

相关文章

  • 最佳情侣身高差--结构体储存
    最佳情侣身高差--结构体储存这道题是因为我用结构体做的单纯的想分享一下#include<stdio.h>typedefstruct//定义一个全局结构体变量{ charsex;//用字符储存性别 doubleh;//储存对应的身高 doubleh1;//储存情侣的身高 }data;//定义的类型名字intmain(){intn......
  • Midjourney画出完美中国情侣,画师、演员、模特一键淘汰
    新智元报道编辑:编辑部继GPT-4之后,MidjourneyV5上线。网友纷纷试玩,画出了一对中国情侣,视觉炸裂,碾压人类画师。昨天,由MidjourneyV5画的一对中......
  • 情侣间必备的责任
    情侣间必备的责任〈了解、包容、照顾、帮助、信任、体贴、〉    了解   两个人一旦真心恋爱了,这是最关键两个字,人往往都要在一起接触时间久了,彼此才能慢慢感觉......
  • 手牵手入门Spring6整合Mybatis3.5
    方式一Object类get和set,无参构造+有参构造Pom.xml引入依赖<!--打包方式jar--><packaging>jar</packaging><!--配置多个仓库--><repositories><!--Spring6-->......
  • P4921 [MtOI2018]情侣?给我烧了!
    前言情人节写的这道题,题目名称好符合我当时的心情。题目链接Luogu:P4921解法容斥我们发现最后要求的结果是恰好\(k\)对情侣坐在一起的方案数,我们就不难想到去计算......
  • 杭州银行牵手火山引擎数智平台,要既“好”又“快”地完成数字化升级
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群1996年杭州银行正式成立,在经过多年经营发展后,已成为国内资产质量领先、业绩优良、综合实力跻......
  • 杭州银行牵手火山引擎数智平台,要既“好”又“快”地完成数字化升级
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群1996年杭州银行正式成立,在经过多年经营发展后,已成为国内资产质量领先、业绩优良、综合实......
  • 【题解】P5692 [MtOI2019]手牵手走向明天
    春节前做大分块是什么奇妙传统吗……这个题好想是好想,但是写起来就是另外一回事了……思路分块。第四分块加强版。区间查询,根号分治做法寄了。看到合并颜色可以想到......
  • 【点击即用】自制的一款情侣小游戏
    开发前提学了3个月的编程,始终停留在书本阶段,并没有开发出产品。所以最近借鉴大神们的源码,加上自己的改动,做了一款在线小游戏(结合使用环境,主要照顾手机移动端,所以电脑端的体......
  • 智慧口岸建设,海尔COSMOPlat牵手美华系统正式签署战略协议
    版权声明:本文章由“上海美华系统有限公司”编辑组汇编而成,未经授权和许可,任何个人或媒体不得对本网站的文章及其他信息资料予以复制、转载、抄袭、改编。上海美华系统有限......