【题目分析】
该题就是计数排序的变种,不同点在于:
1.排序方式:计数排序按非降序排序,本题按参数arr2的元素排序
2.arr2中没有出现的元素需要额外处理
首先找到arr1中的最大值和最小值,确定一个合适的区间,统计arr1中各元素的数量。
再进行两遍历,第一次遍历arr2中的元素,第二次遍历arr2中未出现的元素。
【代码实现】
class Solution {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
//找最大值和最小值
int min = arr1[0], max = arr1[0];
int i = 1;
for(; i < arr1.length; i++) {
if(arr1[i] < min) {
min = arr1[i];
}
if(arr1[i] > max) {
max = arr1[i];
}
}
//确定一个合适的区间
int[] tmp = new int[max - min + 1];
for(i = 0; i < arr1.length; i++) {
tmp[arr1[i] - min]++; // 统计arr1中各元素的数量
}
int[] res = new int[arr1.length];
int index = 0, count = 0;
// 首次遍历处理出现在arr2的元素
for(i = 0; i < arr2.length; i++) {
count = tmp[arr2[i] - min];
while(count-- > 0) {
res[index++] = arr2[i];
}
tmp[arr2[i] - min] = 0;
}
// 第二次遍历处理arr2中没有的元素
for(i = 0; i < tmp.length; i++) {
count = tmp[i];
while(count-- > 0) {
res[index++] = i + min;
}
}
return res;
}
}