1122. 陣列的相對排序 [JAVA]
阿新 • • 發佈:2021-01-09
給你兩個陣列,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]
提示:
1 <= arr1.length, arr2.length <= 1000
0 <= arr1[i], arr2[i] <= 1000
arr2 中的元素 arr2[i] 各不相同
arr2 中的每個元素 arr2[i] 都出現在 arr1 中
解題思路:
使用計數排序
- 使用一個長度為1001(下標從 0 到 1000)的陣列 arr,記錄每一個元素在陣列 arr1 中出現的次數。
- 隨後我們遍歷陣列 arr2 ,當遍歷到元素 i 時,我們將 arr[i] 個 i 加入 arr1 中,並將 arr[i] 清零。
- 當遍歷結束後,所有在 arr2 中出現過的元素就已經有序了。
- 此時還剩下沒有在 arr2 中出現過的元素,因此我們還需要對整個陣列 arr 進行一次遍歷。
- 當遍歷到元素 i 時,如果 arr[i] 不為 0,我們就將 arr[i] 個 i 加入 arr1 中。
細節
我們可以對空間複雜度進行一個小優化。實際上,我們不需要使用長度為 1001 的陣列,而是可以找出陣列 arr1 中的最大值 upper,使用長度 upper+1 的陣列即可。
程式碼實現:
public static int[] relativeSortArray(int[] arr1, int[] arr2) {
int upper = 0;
for (int x : arr1) {
upper = Math.max(upper, x);
}
int[] arr = new int[upper + 1];
for (int i : arr1){
//記錄每一個元素在陣列 arr1 中出現的次數。
arr[i] += 1;
}
int k = 0;
for(int i : arr2){
//將 arr[i] 個 i 加入 arr1 中
while(arr[i] != 0){
arr1[k++] = i;
arr[i] -= 1;
}
}
for (int i = 0; i < arr.length; i++) {
//如果 arr[i] 不為 0,我們就將 arr[i] 個 i 加入 arr1 中
while(arr[i] != 0){
arr1[k++] = i;
arr[i] -= 1;
}
}
return arr1;
}
結果: