1. 程式人生 > 實用技巧 >每日一題20201114(1122. 陣列的相對排序)

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

重點

首先注意幾個重點:

1. arr1和arr2裡最大的元素不會超過1000
2. arr2裡面沒有重複的元素
3. arr2裡面每個元素必定在arr1裡面出現

思路

1. 先建立一個大小為1001的陣列data用來存放arr1中每個元素出現的次數(因為最大值可能是1000),其實這裡可以簡化,只要這個陣列的長度等於max(arr1)+1即可覆蓋到所有arr1中的數字;
2. 建立一個大小為arr1的陣列或者直接沿用arr1(因為arr1的資訊已經被記錄到data數組裡面了)
3. 遍歷arr2,去data中取出arr1中包含arr2元素的數量,分別插入這個新陣列並把data裡面arr2的相關資料都置為0,保證後續data中只有arr1中特有的元素。
4. 遍歷data,把剩下的資料寫到新陣列。

方法一:

class Solution:
    def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
        # 建立一個能容納arr1最大值的陣列
        data = [0] * (max(arr1)+1)
        # 儲存arr1中的元素值和數量
        for a in arr1:
            data[a] += 1
        # 最終結果陣列
        result = []
        # 把arr2的所有元素寫入result陣列
        for d in arr2:
            length = data[d]
            for x in range(length):
                result.append(d)
            data[d] = 0
        # i是data中剩餘arr1資料的值,可能會有多個,所以需要插入n個i,當n等於0的時候代表n不存在或者n是arr2裡的元素,直接continue
        for i, n in enumerate(data):
            if n == 0:
                continue
            for x in range(n):
                result.append(i)
        return result

優化(少用一個result陣列,直接在arr1修改)

class Solution:
    def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
        data = [0] * (max(arr1)+1)
        for a in arr1:
            data[a] += 1
        # 定義一個指標指向當前已經替換的元素
        i = 0
        for d in arr2:
            length = data[d]
            for x in range(i, i+length):
                arr1[x] = d
            i += length
            data[d] = 0
        for j, n in enumerate(data):
            if n == 0:
                continue
            for x in range(i, i+n):
                arr1[x] = j
            i += n
        return arr1