1122. 陣列的相對排序(計數排序 / 自定義排序)

lankerenx發表於2020-11-14

1122. 陣列的相對排序

在這裡插入圖片描述


位置排序題 >> 多種解法

  1. 元素的範圍為 [ 0 , 1000 ] [0, 1000] [0,1000],這個範圍不是很大,可以考慮不基於比較的排序 >> 計數排序

  2. 自定義排序
    2.1 arr2 規定了比較的順序 >> 使用 雜湊表 來記錄位置

  3. 雜湊表…


計數排序

當範圍實際並不是很大 >> 其實也可以使用不是基於比較的排序 !


    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;
    }


在這裡插入圖片描述

相關文章