Welcome to Subscribe On Youtube
Formatted question description: https://leetcode.ca/all/1122.html
1122. Relative Sort Array (Easy)
Given two arrays arr1
and arr2
, the elements of arr2
are distinct, and all elements in arr2
are also in arr1
.
Sort the elements of arr1
such that the relative ordering of items in arr1
are the same as in arr2
. Elements that don't appear in arr2
should be placed at the end of arr1
in ascending order.
Example 1:
Input: arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6] Output: [2,2,2,1,4,3,3,9,6,7,19]
Constraints:
1 <= arr1.length, arr2.length <= 1000
0 <= arr1[i], arr2[i] <= 1000
- All the elements of
arr2
are distinct. - Each
arr2[i]
is inarr1
.
Solution 1.
-
class Solution { public int[] relativeSortArray(int[] arr1, int[] arr2) { Map<Integer, Integer> orderMap = new HashMap<Integer, Integer>(); int length1 = arr1.length, length2 = arr2.length; for (int i = 0; i < length2; i++) { int num = arr2[i]; orderMap.put(num, i); } for (int i = 1; i < length1; i++) { int num = arr1[i]; int order = orderMap.getOrDefault(num, Integer.MAX_VALUE); int insertIndex = -1; for (int j = i - 1; j >= 0; j--) { int curOrder = orderMap.getOrDefault(arr1[j], Integer.MAX_VALUE); if (curOrder < order || curOrder == order && arr1[j] < num) { insertIndex = j; break; } arr1[j + 1] = arr1[j]; } insertIndex++; arr1[insertIndex] = num; } return arr1; } } ############ class Solution { public int[] relativeSortArray(int[] arr1, int[] arr2) { int[] mp = new int[1001]; for (int x : arr1) { ++mp[x]; } int i = 0; for (int x : arr2) { while (mp[x]-- > 0) { arr1[i++] = x; } } for (int j = 0; j < mp.length; ++j) { while (mp[j]-- > 0) { arr1[i++] = j; } } return arr1; } }
-
// OJ: https://leetcode.com/problems/relative-sort-array/ // Time: O(AlogA) // Space: O(B) class Solution { public: vector<int> relativeSortArray(vector<int>& A, vector<int>& B) { unordered_map<int, int> m; for (int i = 0; i < B.size(); ++i) m[B[i]] = i; sort(begin(A), end(A), [&](int a, int b) { if (m.count(a) && m.count(b)) return m[a] < m[b]; if (m.count(a) == 0 && m.count(b) == 0) return a < b; return m.count(a) > 0; }); return A; } };
-
class Solution: def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]: mp = [0] * 1001 for x in arr1: mp[x] += 1 i = 0 for x in arr2: while mp[x] > 0: arr1[i] = x mp[x] -= 1 i += 1 for x, cnt in enumerate(mp): for _ in range(cnt): arr1[i] = x i += 1 return arr1 ############ # 1122. Relative Sort Array # https://leetcode.com/problems/relative-sort-array/ class Solution: def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]: mp = collections.Counter(arr1) s = set(arr2) res = [] for num in arr2: res += [num] * mp[num] leftover = [] for num in arr1: if num not in s: leftover.append(num) return res + sorted(leftover)
-
func relativeSortArray(arr1 []int, arr2 []int) []int { mp := make([]int, 1001) for _, x := range arr1 { mp[x]++ } i := 0 for _, x := range arr2 { for mp[x] > 0 { arr1[i] = x mp[x]-- i++ } } for j, cnt := range mp { for cnt > 0 { arr1[i] = j i++ cnt-- } } return arr1 }