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 中
解题思路:
- 将 arr2 放入 HashMap, 以便用O(1)的时间复杂度判断元素是否在arr2中
- 自定义排序规则
- 对于 x y 都出现在HashMap中,比较其在 arr2中的角标
- 对于 x y 都未出现在HashMap中,比较 x y 即可
- 其他情况 谁在HashMap中,谁就排前面
方法一:
public int[] relativeSortArray(int[] arr1, int[] arr2) {
// 将 arr2 放入 HashMap
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < arr2.length; i++) {
map.put(arr2[i], i);
}
// arr 转为 list以便调用基础api
List<Integer> list = new ArrayList<>();
for (int i = 0; i < arr1.length; i++) {
list.add(arr1[i]);
}
// 排序
Collections.sort(list, (i, j) -> {
if (map.containsKey(i) && map.containsKey(j)) {
return map.get(i) - map.get(j);
} else if (map.containsKey(i) && !map.containsKey(j)) {
return -1;
} else if (!map.containsKey(i) && map.containsKey(j)) {
return 1;
} else {
return i - j;
}
});
for (int i = 0; i < list.size(); i++) {
arr1[i] = list.get(i);
}
return arr1;
}