将一个乱序数组变为有序数组的最少交换次数

给定一个包含1-n的数列,通过交换任意两个元素给数列重新排序。求最少需要多少次交换,能把数组排成按1-n递增的顺序

总之就是将这个位置应该出现的元素和这个位置现在的元素交换位置

(其实就是将应该出现在这个位置的元素换到这个位置来,比如第i个位置,应该出现i+1,于是将i+1和nums[i]进行交换)

 代码实现:

核心:记住一点,hashmap用来存储数组中每个元素在原数组中的索引

class Solution
{
    public int test(int[] nums)
    {
        int  result=0;

        //记录下每个位置元素最开始的坐标
        //比如  5 4 1 2 3  hashmap里面存的key:value就是 5:0   4 :1   1:2   2:3   3:4
        HashMap<Integer,Integer>  hashmap=new HashMap();

        for(int i=0;i<nums.length;i++)
        {
            hashmap.put(nums[i],i);//原数组中每个数对应的索引
        }

        //升序数组里应该是1,2,3,4,5
        for(int i=0;i<nums.length;i++)
        {
           if(nums[i]!=i+1)//索引为i的位置,应该放i+1
           {

               int index=hashmap.get(i+1);//取出i+1这个数在原数组中的索引,这行代码神来之笔

              
               //交换nums[i]和nums[index]
               int  temp=nums[i];

               nums[i]=nums[index];

               nums[index]=temp;

               result++;
           }
           else
           {
               continue;
           }
        }
        return  result;

    }
}

public class Test
{
    public static void main(String[] args)
    {
      Solution solution=new Solution();
//      int[] nums={5,4,1,2,3};
      int[] nums={5,4,3,2,1};
      System.out.println(solution.test(nums));

    }
}

变形题:

有两个长度都为n的数组A,B,而且两个数组都是1~n之间每个数恰好出现一次,每一次可以随便挑选一个数组,然后交换这个数组中两个元素的位置,问至少要多少次,才能使这两个数组相同

比如:A数组[3, 1,2,4,5]

       B数组[2,4,5,1,3]

第一步交换A中的1和4

第二步交换B中的2和5                                           

第三步交换A中的3和5

总共需要3步

                                        3,1,2,4,5这五个数在A数组中的顺序是1,2,3,4, 5

3,1,2,4,5这五个数在B数组中的顺序是3 ,4,5,2,1      

现在就转化为将3 4 5 2 1这个数组变成 1,2,3,4,5顺序数组所需要的最少次数

如何得到要交换的数组:

HashMap  hashmap_B=new  HashMap();

for(int i=0;i<numsB.length;i++)
{
    hashmap_B.put(numsB[i],i);//把数组B中每一个元素的索引存起来
}

for(int i=0;i<numsA.length;i++)
{
  int temp=hashmap_B.get(nums[i]);//取出数组B中相应数的索引
  nums[i]=temp;
}

 然后再将这个数组传进方法内,就行了

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值