题目:

给定一个包含1-n的数列,我们通过交换任意两个元素给数列重新排序。

求最少需要多少次交换,能把数组排成按1-n递增的顺序,(数组中的元素互不重复)。

比如 初始状态 5 4 3 2 1 。交换5和1的位置 得到 1 4 3 2 5,再交换4 2的位置得到 1 2 3 4 5.只需要两次即可。

方法一:

第一个数排序之后应该是1,但此时第一个位置是5,那么把5放到5应该在的位置上,

然后再把5原来位置上那个数字放到第一个位置上, 即得到 1 4 3 2 5 。此时第一个位置的数字已经找到 ,往后遍历位置2.

得到4,接下来把4放到4应该在的位置,得到 1 2 3 4 5.此时已经完全有序。

总结一下就是:

交换的时候,遍历数组,判断当前元素是否在最终位置,否则把它交换到它的最终位置,(即每次交换至少让其中一个元素被放到其最终位置),这样统计总交换次数。

int getMinSwaps(vector &nums)

{

mapmp;

vectorsortedNums(nums);

sort(sortedNums.begin(), sortedNums.end());for (int i = 0; i < sortedNums.size(); i++)mp[sortedNums[i]] = i ;//记录下标索引

int cnt = 0;for (int i = 0; i < nums.size();i++)

{if (nums[i] == sortedNums[i])continue;

swap(nums[i], nums[mp[nums[i]]]);//交换到nums[i]这个值应该在的位置

cnt++;

}returncnt;

}

方法二:

在原数组中,每个元素添加一个出边指向它最终的位置,这样画完出边后,

最少会成一个环,最多n个环。 然后原理就是, 最少交换次数=结点数n-形成的环数。

int getMinSwaps(vector &nums)

{//排序

vectornums1(nums);

sort(nums1.begin(),nums1.end());

unordered_mapm;int len =nums.size();for (int i = 0; i < len; i++){

m[nums1[i]]= i;//建立每个元素与其应放位置的映射关系

}int loops = 0;//循环节个数

vector flag(len,false);//找出循环节的个数

for (int i = 0; i < len; i++){if (!flag[i]){//已经访问过的位置不再访问

int j =i;while (!flag[j]){

flag[j]= true;

j= m[nums[j]];//原序列中j位置的元素在有序序列中的位置

}

loops++;

}

}return len -loops;

}

参考:

python 数组排序最少交换次数_数组排序 使得交换次数最少相关推荐

  1. python水浒传名字次数_水浒传人物登场次数数据分析

    这个数据分析使用的是python语言,我安装了anaconda,是在jupyter notebook中做的. 首先需要引入可能用到的库: 小案例一是一个基本的文本词频统计 文本词频统计的结果如下(出现 ...

  2. mysql交换分区_对MySQL交换分区的实践

    前言 在介绍交换分区之前,我们先了解一下 mysql 分区. 数据库的分区有两种:水平分区和垂直分区.而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区.水平分区即:以行为单位对表进行分区.比 ...

  3. 天数最少的年份_为何每年二月天数最少且每月有长有短?只因凯撒大帝一句话...

    为何每年二月天数最少且每月有长有短?只因凯撒大帝一 句话 你是否还记得小学数学中关于公历每月天数的那句口 诀?没错,是"一三五七八十腊. 31 天永不差"(这里的"腊&q ...

  4. python counter 出现次数最少的元素_[PY3]——找出一个序列中出现次数最多的元素/collections.Counter 类的用法...

    问题 怎样找出一个序列中出现次数最多的元素呢? 解决方案 collections.Counter 类就是专门为这类问题而设计的, 它甚至有一个有用的 most_common() 方法直接给了你答案 c ...

  5. 十位数和个位数交换python_整型变量 x中存放了一个两位数,要将这个两位数的个位数字和十位数字交换位置,例如,13变成31,正确的Python表达式是________。_学小易找答案...

    [多选题]计量经济学检验主要是检验模型是否符合计量经济方法的基本假定.检验内容包括( ) [填空题](_)是运用理论计量经济学提供的工具,研究经济学中某些特定领域的经济数量问题. [多选题]下列属于时 ...

  6. python实现素数筛选法_从零开始学Python系列-第6讲:循环结构

    应用场景 我们在写程序的时候,一定会遇到需要重复执行某条或某些指令的场景.例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向移动的指令.在这个场景 ...

  7. python爬虫可视化web展示_基于Python爬虫的职位信息数据分析和可视化系统实现

    1. 引言 在这个新时代,人们根据现有的职位信息数据分析系统得到的职位信息越来越碎片化,面对收集到的大量的职位信息数据难以迅速地筛选出对自己最有帮助的职位信息,又或者筛选出信息后不能直观地看到数据的特 ...

  8. 视频教程-微信小程序系统教程python版[3/3阶段]_微信小程序支付-手游开发

    微信小程序系统教程python版[3/3阶段]_微信小程序支付 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试 ...

  9. python能做财务分析吗_您可以使用Python进行财务规划和分析吗?

    python能做财务分析吗 问题 (The Problem) If you work in the Financial Planning and Analysis area, chances are ...

最新文章

  1. ACL 2021 | 结构化知识蒸馏方法
  2. SparseArray代替HashMap
  3. 通过JS和CSS,实现网页加载中的动画效果
  4. java环境配置 Windows10
  5. go语言服务器连接mysql,golang中连接mysql数据库
  6. linux下svn服务器的安装配置和使用
  7. 如何使用notepad++查看二进制bin文件
  8. 左耳朵耗子:996不是福气,但努力就会成功么?
  9. visio怎么画球_cad怎么画装配图
  10. vos对接移动、电信、联通各种线路
  11. 基于深度学习的自然场景文字识别系统研究 faster-RCNN + CRNN (二)
  12. docker的代理配置_wuli大世界_新浪博客
  13. Mongodb数据丢失解决办法
  14. 自然人独资企业要上缴哪些税
  15. jQuery学习笔记(三)jQuery动画效果
  16. 【电脑使用】修改注册表——让有密码的电脑开机自动登录
  17. C语言 打飞机 小游戏
  18. USB设备仿真框架设计指南——11.在托管代码中开发DSF应用程序
  19. dp专题-cf 711c
  20. Linux网络-网络配置命令

热门文章

  1. tomcat环境配置以及cmd下启动tomcat
  2. 为什么“白帽子”会是2017年最好的工作
  3. 手绘板的制作——手绘(1)
  4. 浏览器工作原理:从 URL 输入到页面展现到底发生了什么?
  5. 手写svm识别人是否戴眼镜
  6. Linux 环境变量配置的 6 种方法,记得收藏
  7. Spring Boot如何使用Redis进行API防刷限流?
  8. 自动化的未来是什么?
  9. webdriver配置
  10. 练习-Java字符串之String类常用方法之花名册