遍歷 arr2,根據 cnt 中的計數,將 arr2 中的元素按照其在 arr2 中的順序加入到結果陣列 ans 中,並將這些元素的計數歸零。
最後,對於那些不在 arr2 中但在 arr1 中出現的元素,按照自然數升序的順序,將它們加入結果陣列 ans 中。
複雜度分析
時間複雜度:O(n+m+k),其中 n 是 arr1 的長度,m 是 arr2 的長度,k 是數字範圍的大小,本題中為 1001。
對 arr1 中的元素進行計數需要 O(n) 時間。
對 arr2 中的元素進行處理需要 O(m) 時間。
最後處理剩餘元素的步驟需要 O(k) 時間。
空間複雜度:O(k),需要一個大小為 1001 的計數陣列 cnt。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution: defrelativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]: cnt = [0] * (1001) for x in arr1: cnt[x] += 1 ans = [] for x in arr2: ans.extend([x] * cnt[x]) cnt[x] = 0 for x inrange(1001): if cnt[x] > 0: ans.extend([x] * cnt[x]) return ans
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution { public: vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2){ vector<int> cnt(1001); for (int x : arr1) cnt[x]++; int i = 0; for (int x : arr2) while (cnt[x]-- > 0) arr1[i++] = x; for (int x = 0; x < 1001; x++) while (cnt[x]-- > 0) arr1[i++] = x; return arr1; } };
寫在最後
Cover photo is generated by @たろたろ, thanks for their work!