有序数组两两交换,求最小的交换次数。

1、有序数组,按照0到n – 1的序列编号,顺序打乱,请您用最小的交换操作次数,使其重新变成递增序列。假如:编号保存在一个数组array当中。一次交换操作可以将这个数组的其中两个数互换。
限制: 
1 <= n <= 100000    

例 1:
输入: array = [2,0,1]
输出: 2
解释: 先交换0和2(一次交换操作),再交换1和2(一次交换操作)即可。

例 2:
输入: array = [0,1,2,3,4]
输出: 0
解释: 不用任何交换。     
 

2、若初始序列为gbfcdae,那么至少需要__次两两交换,才能使该序列变为abcdefg。任给一个自由a--g这7个字母组成的排列,最坏的情况下需要至少__次两两交换,才能使序列变为abcdefg。

解题思路:求数组中环的数量。

    private static int function(int[] array) {
        if (array == null || array.length == 0) {
            return 0;
        }
        int count = 0;
        int len = array.length;
        int[] temp = new int[len];
        for (int i = 0; i < len; i++) {
            if (temp[i] == 0) {
                count++;
                for (int j = i; temp[j] == 0;j = array[j]) {
                    temp[j] = 1;
                }
            }
        }
        return len - count;
    }

思路解析:
1、首先,最多需要交换几次?答案是n次,这很好想,把每个数放到本应在的地方,即使那个数本来就在那我们依旧算它交换一次,所以最多是n次。
然后,我们要找环,假设这个环有k个数,所谓的环就是这k个数可以不借助其他的数进行归位,然后我们交换k-1次即可,可以发现每多一个环就少一次交换,所以是n-环的数量。
2、https://www.nowcoder.com/questionTerminal/acaafbd0eeca448aad4997f43f357f2f?orderByHotValue=0&pos=39&mutiTagIds=579

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值