题目链接:
力扣https://leetcode-cn.com/problems/relative-sort-array/
【分析】先统计元素的出现顺序,然后遍历arr2,因为arr2肯定在arr1中出现,所以至少有一个,最终结果中就是按照arr2的遍历顺序排序的n个元素,所以直接extend arr2中的元素*在arr1中出现的次数即可。然后遍历过程中将这些元素个数设置为0,然后遍历arr1的字典,将字典中出现次数不为0,也就是在arr2中没有出现过的元素加入到re中,再对re排序放在之前的数组后面即可。
class Solution:
def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
from collections import Counter
tab = Counter(arr1)
ans = []
for i in arr2:
ans += [i] * tab[i]
tab[i] = 0
re = []
for k, v in tab.items():
if v != 0:
re += [k] * v
re.sort()
ans.extend(re)
return ans
【Java版】
class Solution {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(Integer it: arr1){
map.put(it, map.getOrDefault(it, 0) + 1);
}
List<Integer> list = new ArrayList<>();
int i, n;
for(Integer it: arr2){
for(i = 0, n = map.get(it); i < n; ++i){
list.add(it);
}
map.put(it, 0);
}
List<Integer> re = new ArrayList<>();
int k, v;
for(Map.Entry<Integer, Integer> entry: map.entrySet()){
v = entry.getValue();
if(v != 0){
k = entry.getKey();
for(i = 0; i < v; i++){
re.add(k);
}
}
}
re.sort(Comparator.naturalOrder());
list.addAll(re);
int[] ans = new int[list.size()];
i = 0;
for(Integer it: list){
ans[i++] = it;
}
return ans;
}
}
【方法二 自定义排序】自定义排序规则
class Solution:
def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
import functools
def cmp(a, b):
aidx, bidx = tab.get(a, 10000), tab.get(b, 10000)
if aidx < bidx:
return -1
elif aidx == bidx:
return a - b
else:
return 1
tab = {}
n = len(arr2)
for i in range(n):
tab[arr2[i]] = i
arr1.sort(key = functools.cmp_to_key(cmp))
return arr1