-
思路一
- 这个题目的arr2相当于重新定义了一种数字的排序方法(类似于之前做过的给字符串按照给定规则排序的题目~),所以说我们可以用一个哈希表记录arr2中每个元素的出现次数,然后遍历arr2,利用出现次数把具体数字填入数组,最后没有出现的数字单独放入一个List,排序后追加到结果数组的后方
class Solution { public int[] relativeSortArray(int[] arr1, int[] arr2) { Map<Integer, Integer> counts = new HashMap<>(); List<Integer> notContains = new ArrayList<>(); for (int num : arr2) { counts.put(num, 0); } for (int num : arr1) { if (!counts.containsKey(num)) notContains.add(num); else { counts.put(num, counts.get(num) + 1); } } List<Integer> result = new ArrayList<>(); int index = 0; for (int num : arr2) { for (int i = 0; i < counts.get(num); i++) { result.add(num); } } Collections.sort(notContains); result.addAll(notContains); return result.stream().mapToInt(Integer::intValue).toArray(); } }
-
思路二
- 因为题目中说了数字范围是[0,1000],所以可以考虑计数排序
- 第一遍先遍历arr1,把每个数字出现的次数记录为count数组
- 然后遍历arr2,利用出现次数把数字填入结果数组,与此同时把count数组对应位置减为0
- 最后遍历一遍count数组,按顺序把剩余出现的数字放入结果数组中
class Solution { public int[] relativeSortArray(int[] arr1, int[] arr2) { Map<Integer, Integer> counts = new HashMap<>(); List<Integer> notContains = new ArrayList<>(); for (int num : arr2) { counts.put(num, 0); } for (int num : arr1) { if (!counts.containsKey(num)) notContains.add(num); else { counts.put(num, counts.get(num) + 1); } } List<Integer> result = new ArrayList<>(); int index = 0; for (int num : arr2) { for (int i = 0; i < counts.get(num); i++) { result.add(num); } } Collections.sort(notContains); result.addAll(notContains); return result.stream().mapToInt(Integer::intValue).toArray(); } }
剑指offer 专项突破版 75、数组相对排序
最新推荐文章于 2023-06-15 16:47:04 发布