1. 程式人生 > 其它 >1122. 陣列的相對排序 [JAVA]

1122. 陣列的相對排序 [JAVA]

技術標籤:LeetCode排序演算法演算法java

給你兩個陣列,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 中

解題思路:

使用計數排序

  1. 使用一個長度為1001(下標從 0 到 1000)的陣列 arr,記錄每一個元素在陣列 arr1 中出現的次數。
  2. 隨後我們遍歷陣列 arr2 ,當遍歷到元素 i 時,我們將 arr[i] 個 i 加入 arr1 中,並將 arr[i] 清零。
  3. 當遍歷結束後,所有在 arr2 中出現過的元素就已經有序了。
  4. 此時還剩下沒有在 arr2 中出現過的元素,因此我們還需要對整個陣列 arr 進行一次遍歷。
  5. 當遍歷到元素 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; }

結果:
在這裡插入圖片描述