zoukankan      html  css  js  c++  java
  • 765. 情侣牵手(贪心,并查集)

      分析:

      方法一:贪心,首先将每个数的位置用map保存,遍历偶数索引的数,异或1找到它的情侣,如果不在当前索引i+1的位置上,就用map找到这个数,交换到i+1的位置上,并且更新i+1位置上的数在map中的位置

    class Solution {
        public int minSwapsCouples(int[] row) {
            int n = row.length;
            Map<Integer,Integer> map = new HashMap<>();
            for(int i = 0; i < n; i++) {
                map.put(row[i],i);
            }
            int res = 0;
            for(int i = 0; i < n; i += 2) {
                int j = row[i] ^ 1; // 找到相邻的情侣 奇数就找到小于1的偶数  偶数就找到大于1的奇数
                if(row[i+1] == j) continue;
                int index = map.get(j);
                row[index] = row[i+1];
                map.put(row[i+1],index);
                row[i+1] = j;
                res++;
            }
            return res;
        }
    }

      方法二:并查集

    class Solution {
        int[] p;
        public int minSwapsCouples(int[] row) {
            int n = row.length;
            p = new int[n];
            for(int i = 0; i < n; i += 2) {
                p[i] = i;  // 初始化
                p[i+1] = i;
            }
            int res = n / 2;
            for(int i = 0; i < n; i += 2) {
                p[find(row[i])] = find(row[i+1]); // 相邻的分到一组
            }
            for(int i = 0; i < n; i++) {
                if(p[i] == i) res--;
            }
            return res;
        }
        public int find(int x) {
            if(x != p[x]) p[x] = find(p[x]);
            return p[x];
        }
    }
  • 相关阅读:
    阅读《构建之法》
    准备工作
    课程总结
    第十四周总结
    第十三周总结
    Flex撑开
    多行文本展示为省略号样式的react组件
    如何在Spring Boot 中动态设定与执行定时任务
    System.arraycopy() 和 Arrays.copyOf() 的区别说明
    使用反射机制,获取 ArrayList 的容量大小
  • 原文地址:https://www.cnblogs.com/yonezu/p/13571725.html
Copyright © 2011-2022 走看看