问题描述:
示例
输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
输出:[2,2,2,1,4,3,3,9,6,7,19]
思路
这道题的重点在于需要统计arr2中的数字在arr1中出现的次数以及未出现的arr1中数字。这样操作很麻烦。不容易实现。
但是,提示中描述了arr1.length<=1000,所以在这里可以利用快速排序的思想。创建一个新数组copy,长度为1001,然后每遍历arr1数组中的一个元素,copy数组对应的角标的元素值+1,即:copy[arr1[i]]++,再将arr2.length作为for循环条件,在for循环中再进行while循环,条件是:如果arr2对应的元素值在copy中大于0,那么就将元素提取出来,放入arr1数组中。每从copy数组中提取一个元素,对应的角标的值-1.最后循环完就将所有arr2在arr1中出现的数字按照相对顺序放在了arr1中,最终只需要再遍历copy数组,如果数组的元素值有大于1的,依次将元素值提取出来,补充在arr1数组后面,随后返回arr1这个数组即可。
java代码
class Solution {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
int[] copy = new int[1001];
for(int i=0;i<arr1.length;i++){
copy[arr1[i]]++;
}
int flag=0;
for(int j=0;j<arr2.length;j++){
while(copy[arr2[j]]>0){
arr1[flag++]=arr2[j];
copy[arr2[j]]--;
}
}
for(int k=0;k<1001;k++){
while(copy[k]>0){
arr1[flag++]=k;
copy[k]--;
}
}
return arr1;
}
}