置换环

置换环可以得到数组排序(可以指定排序方式)所需交换的最小次数。其的思想是:将每个节点指向其排序后应该存放的位置,最终首位相接形成一个环,那么数组排序所需的最小交换次数为数组长度-环的数量

包含自环

置换环-01.jpg

代码为:

public int template(int[] source, int[] target) {
    int len = source.length;
    Map<Integer, Integer> map = new HashMap<>(); // 存储目标排序每个元素的位置
    boolean[] flag = new boolean[len]; // 标识当前字符串是否已经访问过
    for (int i = 0; i < len; i++) map.put(target[i], i);

    int loop = 0; // 环的数量
    for (int i = 0; i < len; i++) {
        if (flag[i]) continue;
        int cur = source[i];
        while (!flag[cur]) {
            flag[cur] = true;
            cur = source[map.get(cur)];
        }
        loop++;
    }
    return len - loop;
}

参考链接:

  1. 【二叉树层序遍历 + 置换环 + Java】逐层排序二叉树所需的最少操作数目
  2. BFS + 置换环 + 离散化
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 课程介绍 先修课:概率统计,程序设计实习,集合论与图论 后续课:算法分析与设计,编译原理,操作系统,数据库概论,人...
    ShellyWhen阅读 6,921评论 0 3
  • to-do:看一下别人写的题解 https://github.com/981377660LMT/algorithm...
    winter_sweetie阅读 4,183评论 1 0
  • LeetCode 刷题随手记 - 第一部分 前 256 题(非会员),仅算法题,的吐槽 https://leetc...
    蕾娜漢默阅读 18,179评论 2 36
  • (Since 2020.10.14-2021.3.10) LeetCode刷题笔记,共两百多题,记录整理如下: 动...
    周恩国的学习笔记阅读 4,206评论 0 1
  • 目标一周刷2道题也不知道能坚持几天,这玩意在leetcode做完怎么保存啊 给一个有序的数组,数组中有重复数字,输...
    H丶ym阅读 3,749评论 0 1