给定一个包含1-n的数列,通过交换任意两个元素给数列重新排序。求最少需要多少次交换,能把数组排成按1-n递增的顺序
总之就是将这个位置应该出现的元素和这个位置现在的元素交换位置
代码实现:
核心:记住一点,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;
}
然后再将这个数组传进方法内,就行了