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.length, arr2.length <= 1000
0 <= arr1[i], arr2[i] <= 1000
arr2
中的元素arr2[i]
各不相同arr2
中的每个元素arr2[i]
都出现在arr1
中
题解
自己写的有点垃圾。思路大概是这样:
- 一个
set
存储arr2
(后发现可优化,直接用map
判断就行),一个HashMap
存储arr1
中arr2
出现数字的次数。 - 其余的没有在
arr2
中出现的数字存储在list
中,对list
进行sort
排序,两个再归并一起。
class Solution {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
if(arr1.length == 0){return arr1;}
Set<Integer> arr2Set = new HashSet<>(); // 存储arr2
Map<Integer, Integer> map = new HashMap<>(); // 用于存储arr2在arr1中对应的数字及个数
List<Integer> list = new ArrayList<>(); // 用于存储arr2不在arr1中的数字
// 把arr2加到哈希表中
for(int i=0; i<arr2.length; ++i){
arr2Set.add(arr2[i]);
map.put(arr2[i], 0);
}
int N = arr1.length;
// map与list初始化
for(int i=0; i<N; ++i){
if(arr2Set.contains(arr1[i])){
map.put(arr1[i], map.get(arr1[i]) + 1);
}else{
list.add(arr1[i]);
}
}
int[] res = new int[N];
int m = list.size();
int k = 0;
for(int i=0; i<arr2.length; ++i){
int key = arr2[i];
for(int j=0; j<map.get(key); ++j){
res[k++] = key;
}
}
if(m != 0){
list.sort(new Comparator<Integer>(){
public int compare(Integer a1, Integer a2){
return a1 - a2;
}
});
for(int i=0; i<m; i++){
res[k++] = list.get(i);
}
}
return res;
}
}
然而以上实在太麻烦了,附一下答案的代码,简洁清爽。
思路不一样的地方是答案的hashmap
存储方式不一样,若是在arr2
中存在,就在map
中存放对应的指数下标index
,若是没有存在则默认用1001
与index
对比.
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;
}
}