leetCode 1122 陣列的相對排序

2021-10-10 13:20:06 字數 2658 閱讀 6540

給你兩個陣列,arr1arr2

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 + 1freq陣列下標,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...