給你兩個陣列,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 中
思路:
由於要按照arr2
中的順序排序,因此可以先將arr2[i]與i
的對映map
,然後遍歷陣列arr1
:
class
solution
for(integer num : arr1) list.
add(num)
; collections.
sort
(list,
newcomparator
()elseif(
!map.
containskey
(o1)
&&!map.
containskey
(o2)
)else
if(map.
containskey
(o1)
)else}}
);for(
int i =
0; i < arr1.length; i++
)return arr1;
}}
將上面邏輯優化後的版本:
class
solution
for(integer num : arr1) list.
add(num)
; collections.
sort
(list,
newcomparator
()return o1 - o2;}}
);for(
int i =
0; i < arr1.length; i++
)return arr1;
}}
思路:由提示可知,arr1中的元素範圍為[0,1000]
並不是很大因此可以使用計數排序,為了優化空間複雜度可以找到arr1
中的最大值upper
與最小值lower
,將arr1
中的元素對映到長度為upper - lower + 1
的freq
陣列下標,arr1
中每個元素對應的位置為arr1[i] - lower
因此可以對arr1
中每個元素進行計數。
建立乙個與arr1
等長的陣列ans
,遍歷arr2
,將freq
對應的出現次數的元素加入ans
中,此時arr1
中的每個arr2
的元素已經排序完成,後一步就是按照再按照從左往右的順序遍歷一遍freq
陣列將其下標對應的元素i + lower
按照剩餘的次數加入ans
陣列中。
class
solution
;// 找到最大值與最小值
int upper =0;
int lower =
1000
;for
(int i =
0; i < arr1.length; i++)if
(lower > arr1[i])}
// 統計頻率
int[
] freq =
newint
[upper - lower +1]
;for
(int i =
0; i < arr1.length; i++
)// 按照頻率加入答案
int[
] ans =
newint
[arr1.length]
;int index =0;
for(
int i =
0; i < arr2.length; i++)}
// 再次遍歷,按照頻率加入答案
for(
int i =
0; i < freq.length; i++)}
return ans;
}}
LeetCode 1122 陣列的相對排序
給你兩個陣列,arr1 和 arr2,arr2 中的元素各不相同 arr2 中的每個元素都出現在 arr1 中 對 arr1 中的元素進行排序,使 arr1 中項的相對順序和 arr2 中的相對順序相同。未在 arr2 現過的元素需要按照公升序放在 arr1 的末尾。示例 輸入 arr1 2,3,1...
LeetCode1122 陣列的相對排序
給你兩個陣列,arr1 和 arr2,arr2 中的元素各不相同 arr2 中的每個元素都出現在 arr1 中 對 arr1 中的元素進行排序,使 arr1 中項的相對順序和 arr2 中的相對順序相同。未在 arr2 現過的元素需要按照公升序放在 arr1 的末尾。示例 輸入 arr1 2,3,1...
leetcode 1122 陣列的相對排序
首先想到的是用兩個列表將arr1中和arr2中共有的元素遍歷出來,其餘非共有的元素分別生成兩個新列表 同時,創造乙個新函式 將共有元素列表x按照新函式 arr2的順序 進行排列 同時從小到大排列非共有元素的集合a 輸出兩個列表相加 class solution def relativesortarr...