先是自定义排序
class Solution {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
Map<Integer, Integer> map = new HashMap<>();
List<Integer> list = new ArrayList<>();
for(int num : arr1) list.add(num);
for(int i = 0; i < arr2.length; i++) map.put(arr2[i], i);
Collections.sort(list, (x, y) -> {
if(map.containsKey(x) || map.containsKey(y)) return map.getOrDefault(x, 1001) - map.getOrDefault(y, 1001);
return x - y;
});
for(int i = 0; i < arr1.length; i++) arr1[i] = list.get(i);
return arr1;
}
}
再是计数排序(特殊的桶排序)
class Solution {
public static int[] relativeSortArray(int[] arr1, int[] arr2) {
//第一步:将arr1中数据分配到各桶中
int[] bucket=new int[1001];
int[] res=new int[arr1.length];
for (int data:arr1)
bucket[data]++;
//第二步:按照arr2的顺序收集桶中数据
int j=0;
for (int data:arr2){
while (bucket[data]-->0)
//循环结束时将桶里的每一个出现的arr2的数据都减为了0
res[j++]=data;
}
//第三步:按升序顺序收集桶中其他数据
//(因为桶存的是索引出现的次数,本来就是升序)
for (int i=0;i<1001;i++){
while (bucket[i]-->0)//将桶里i索引处不是0个的数据收集存入res数组中
res[j++]=i;
}
return res;
}
}