数组排序 使得交换次数最少

给定一个1-n的数列,目标是通过最少的交换次数将其排序。方法包括:1) 比较当前位置元素与目标位置,进行交换;2) 构建出边图,最少交换次数等于节点数减环数。参考了CSDN上的相关博客文章。
摘要由CSDN通过智能技术生成

题目:   

给定一个包含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<int> &nums)
{
    ma
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值