1122. 陣列的相對排序(計數排序 / 自定義排序)
位置排序題 >> 多種解法
-
元素的範圍為 [ 0 , 1000 ] [0, 1000] [0,1000],這個範圍不是很大,可以考慮不基於比較的排序 >> 計數排序
-
自定義排序
2.1 arr2 規定了比較的順序 >> 使用 雜湊表 來記錄位置 -
雜湊表…
計數排序
當範圍實際並不是很大 >> 其實也可以使用不是基於比較的排序 !
public int[] relativeSortArray(int[] arr1, int[] arr2) {
int upper = 0;
for (int i1 : arr1) {
if (upper < i1) upper = i1;
}
int[] count = new int[upper + 1];
for (int i1 : arr1) {
count[i1]++;
}
int[] ans = new int[arr1.length];
int index = 0;
for (int v: arr2) {
while (count[v] > 0){
ans[index++] = v;
count[v]--;
}
}
for (int i = 0; i < upper + 1; i++) {
while (count[i] > 0) {
ans[index++] = i;
count[i]--;
}
}
return ans;
}
自定義排序
這個自定義排序
m a p . g e t O r D e f a u l t ( o 1 , 1001 ) − m a p . g e t O r D e f a u l t ( o 2 , 1001 ) ; map.getOrDefault(o1, 1001) - map.getOrDefault(o2, 1001); map.getOrDefault(o1,1001)−map.getOrDefault(o2,1001);
很妙 >> 即解決了兩個都在 arr2 陣列裡時的排序, 又解決了一個在 arr2 陣列裡,另一個不在時, 不在 arr2 陣列裡那個會排在後面
public int[] relativeSortArray(int[] arr1, int[] arr2) {
Map<Integer, Integer> map = new HashMap<>();
// 初始化 map
for (int i = 0; i < arr2.length; i++) {
map.put(arr2[i], i);
}
int[] ans = new int[arr1.length];
// int 陣列不能使用 自定義排序
List<Integer> list = new ArrayList<>();
for (int i = 0; i < arr1.length; i++) { list.add(arr1[i]); }
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if(map.containsKey(o1) || map.containsKey(o2)){
return map.getOrDefault(o1, 1001) - map.getOrDefault(o2, 1001);
}
return o1 - o2;
}
});
// list 已經排好序了
int index = 0;
for (Integer v: list) {
ans[index++] = v;
}
return ans;
}
相關文章
- js:陣列自定義排序JS陣列排序
- Javascript陣列排序sort方法和自定義排序方法JavaScript陣列排序
- LeetCode 關於陣列的相對排序LeetCode陣列排序
- Java 對映 自定義排序Java排序
- 陣列的排序陣列排序
- 陣列排序陣列排序
- Python自定義排序Python排序
- MySQL自定義排序MySql排序
- LeetCode1122. 陣列的相對排序(20201114每日一題)LeetCode陣列排序每日一題
- js陣列排序JS陣列排序
- JavaScript 陣列排序JavaScript陣列排序
- 物件陣列排序物件陣列排序
- PAT乙級——1092(陣列排序 自定義sort)Java實現陣列排序Java
- 計數排序vs基數排序vs桶排序排序
- 為什麼處理排序陣列比未排序陣列快排序陣列
- 1117陣列排序的技巧陣列排序
- 陣列排序的實現陣列排序
- c# 陣列排序C#陣列排序
- 二維陣列排序陣列排序
- 多維陣列排序陣列排序
- js陣列排序整理JS陣列排序
- 陣列氣泡排序陣列排序
- 陣列選擇排序陣列排序
- Java排序之計數排序Java排序
- 非交換排序-計數排序和桶排序排序
- Java 列表元素自定義排序Java排序
- 排序演算法__計數排序排序演算法
- 陣列進行排序的方法陣列排序
- 陣列的去重和排序陣列排序
- Javascript中的陣列物件排序JavaScript陣列物件排序
- 基於桶的排序之計數排序排序
- 陣列先去重,後排序陣列排序
- PHP 多維陣列排序PHP陣列排序
- 二位陣列排序陣列排序
- c++陣列排序插入C++陣列排序
- 二維陣列行排序陣列排序
- php 二維陣列排序PHP陣列排序
- 為什麼處理排序的陣列要比非排序的快排序陣列