LeetCode1122. 陣列的相對排序(20201114每日一題)

才莘發表於2020-11-14

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

提示:

arr1.length, arr2.length <= 1000
0 <= arr1[i], arr2[i] <= 1000
arr2 中的元素 arr2[i] 各不相同
arr2 中的每個元素 arr2[i] 都出現在 arr1 中

連結:https://leetcode-cn.com/problems/relative-sort-array

import java.util.Arrays;

/**
 * 給你兩個陣列,arr1 和 arr2,
 * <p>
 * arr2 中的元素各不相同
 * arr2 中的每個元素都出現在 arr1 中
 * 對 arr1 中的元素進行排序,使 arr1 中項的相對順序和 arr2 中的相對順序相同。未在 arr2 中出現過的元素需要按照升序放在 arr1 的末尾。
 * <p>
 * 示例:
 * <p>
 * 輸入: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]
 *
 * @author mac
 * @date 2020/11/14-9:51
 */
public class t1122_陣列的相對排序 {

    public static void main(String[] args) {

    }

    /**
     * @param arr1 待排序陣列
     * @param arr2 排序規則陣列
     * @return
     */
    public int[] relativeSortArray(int[] arr1, int[] arr2) {
        int[] arr = new int[arr1.length];
        int a = 0;

        // O(k*n) 雙重迴圈,把符合條件的資料放入新陣列,老陣列置位-1
        for (int i = 0; i < arr2.length; i++) {
            for (int j = 0; j < arr1.length; j++) {
                if (arr2[i] == arr1[j]) {
                    arr[a] = arr1[j];
                    a++;
                    arr1[j] = -1;
                }
            }
        }

        // 如果arr1中沒有出現arr2中出現的資料,直接返回
        int k = arr1.length - (a + 1);
        if (k <= 0) {
            return arr;
        }

        // 從小到大排序
        Arrays.sort(arr1);

        // 不是-1的資料繼續set到新陣列
        for (int i = 0; i < arr1.length; i++) {
            if (arr1[i] != -1) {
                arr[a] = arr1[i];
                k++;
                a++;
            }
        }
        return arr;
    }

    /**
     * @param arr1 待排序陣列
     * @param arr2 排序規則陣列
     * @return arr 新陣列
     */
    public int[] relativeSortArray0(int[] arr1, int[] arr2) {
        int[] nums = new int[1001];
        int[] arr = new int[arr1.length];

        // 遍歷arr1,統計每個元素的出現的次數
        for (int i : arr1) {
            nums[i]++;
        }

        // 遍歷arr2,把arr2中出現的記錄在arr新陣列裡
        int a = 0;
        for (int i : arr2) {
            while (nums[i] > 0) {
                arr[a++] = i;
                nums[i]--;
            }
        }

        // 遍歷nums,處理剩下arr2中未出現的元素
        for (int i = 0; i < nums.length; i++) {
            while (nums[i] > 0) {
                arr[a++] = i;
                nums[i]--;
            }
        }
        return arr;
    }
}

 

相關文章