题目
思路
题目明确提出数组中的数字都在0到1000的范围内。这是一个很明显的提示,据此可以考虑采用计数排序
先统计arr1
中每个元素出现的次数,放到count
中:
int[] count = new int[1001];
for (int num : arr1) {
count[num]++;
}
再按照arr2
的顺序,将arr1
中在arr2
出现过的数字输出:
这里直接复用arr1
,因为arr1
中的元素已经可以用count
表示,因此原地覆盖没有问题,不会丢数据
int i = 0;
for (int num2 : arr2) {
while (count[num2] > 0) {
arr1[i++] = num2;
count[num2]--;
}
}
最后按照从小到大的顺序,将arr1
中没在arr2
出现过的数,输出到arr1
:
for (int j = 0;j<=1000;j++) {
while (count[j] > 0) {
arr1[i++] = j;
count[j]--;
}
}
整个过程没有用到额外空间,时间复杂度为O(N)
代码
public int[] relativeSortArray(int[] arr1, int[] arr2) {
int[] count = new int[1001];
for (int num : arr1) {
count[num]++;
}
int i = 0;
for (int num2 : arr2) {
while (count[num2] > 0) {
arr1[i++] = num2;
count[num2]--;
}
}
for (int j = 0;j<=1000;j++) {
while (count[j] > 0) {
arr1[i++] = j;
count[j]--;
}
}
return arr1;
}