LCR 075. 数组的相对排序 / 1122. 数组的相对排序
给定两个数组,
arr1
和arr2
,
arr2
中的元素各不相同arr2
中的每个元素都出现在arr1
中对
arr1
中的元素进行排序,使arr1
中项的相对顺序和arr2
中的相对顺序相同。未在arr2
中出现过的元素需要按照升序放在arr1
的末尾。示例:
输入: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]
思路:
arr1有两种情况:
1.长度为1,这种情况下只输出arr1就可以,不用进行排序
2.长度大于1,这种情况就得根据arr2的位置进行排序
第二种情况的思路如下:
1.先创建一个长度为1001的数组
2.遍历arr1的元素,利用数组conuts[num]++的方法计算arr1中每个元素出现的次数
3.再遍历arr1每个元素出现的次数之后,将与arr2重叠的元素添加到arr1数组中,从前往后排
4.重叠的元素排序完毕,接下来排序非重叠元素
【在第二点中我们已经遍历arr1每个元素出现的次数,因此在第三步骤之后重叠的元素counts[num]次数为0,
剩下的counts值大于0的都是非重叠元素,只要讲这些元素添加到arr1之后即可】
5.返回arr1数组
class Solution {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
if(arr1.length<=1)
return arr1;
int[] counts = new int[1001];
//遍历arr1每个元素出现的次数
for(int num : arr1){
counts[num]++;
}
//将与arr2重叠的元素添加到arr1数组中
int i = 0;
for(int num : arr2){
while(counts[num]>0){
arr1[i] = num;
i++;
counts[num]--; //直到重叠次数为0,则继续遍历arr2数组
}
}
//重叠的元素排序完毕,接下来排序非重叠元素
for(int num = 0;num<counts.length;num++){
while(counts[num]>0){
arr1[i] = num; //i的值延续重叠的元素添加到arr1数组完毕后的i值
i++;
counts[num]--;
}
}
return arr1;
}
}