LeetCode 分類顏色

2022-08-28 17:24:19 字數 3808 閱讀 4036

leetcode   分類顏色

給定乙個包含紅色、白色和藍色,一共 n 個元素的陣列,原地

對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。

此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。

注意:

不能使用**庫中的排序函式來解決這道題。

示例:

輸入: [2,0,2,1,1,0]

輸出: [0,0,1,1,2,2]

高階:

1.   使用基數排序:

1

class

solution:

2def

sortcolors(self, nums):

3"""

4:type nums: list[int]

5:rtype: void do not return anything, modify nums in-place instead.

6"""7#

桶排序8 count =

9for i in [0,1,2]:

1011 j=0

12for i in [0,1,2]:

13while count[i]>0:

14 nums[j] =i

15 j += 1

16 count[i] -= 1

17print(nums)

2.    使用快排:

兩路快排的partition的實現(c++):

1 //v為pivot,初始儲存在arr[l]的位置 

2 int j = l; // 迴圈過程保持 arr[l+1...j] < v ; arr[j+1...i) >v

3for( int i = l + 1 ; i <= r ; i ++)

4if( arr[i] 5 swap( arr[++j] , arr[i] );

6 swap( arr[l] , arr[j]); // 此時,j指向pivot的正確位置

1

class

solution:

2def

_sortcolors(self, nums, l, r):

3if l >=r:

4return5#

pratition

6 j = l+1

7 pivot =nums[l]

8for i in range(l+1, r+1):

9if nums[i] 10 nums[i], nums[j] =nums[j], nums[i]

11 j += 1

12 j -= 1

13 nums[l], nums[j] =nums[j], nums[l]

1415

#devide

16 self._sortcolors(nums, l, j-1)

17 self._sortcolors(nums, j+1, r)

18def

sortcolors(self, nums):

19"""

20:type nums: list[int]

21:rtype: void do not return anything, modify nums in-place instead.

22"""

23 self._sortcolors(nums, 0, len(nums)-1)

這樣的乙個快排,在面臨有序或者近乎有序的陣列時,會退化成為乙個o(n^2)的演算法。於是我們使用了乙個很簡單的隨機選取pivot的方式來處理這個問題。這步隨機化讓快速排序的時間期望成為了o(nlogn),並且只有極低的概率退化為o(n^2)。

面對有大量重複元素的資料時,還是有可能退化成o(n^2)級別的。通過這個思路,我們可以進一步優化,提出三路快排的思想。

3.   三路快排

三路快排的partition**是這樣的。

1

//v為pivot,初始儲存在arr[l]的位置

2int lt = l; //

迴圈過程中保持 arr[l+1...lt] < v

3int gt = r + 1; //

迴圈過程中保持 arr[gt...r] > v

4int i = l+1; //

迴圈過程中保持 arr[lt+1...i) == v

5while( i 8else

if( arr[i] >v )

10else

//arr[i] == v

11 i ++;

12}

13swap( arr[l] , arr[lt] );

14//

此時 arr[lt...gt-1]部分為陣列中元素等於v的部分

15//

之後只需要遞迴地對arr[l...lt-1]和arr[gt...r]兩部分進行三路快排即可

1

class

solution:

2def

_sortcolors(self, nums, l, r):

3if l >=r:

4return5#

pratition

6 pivot =nums[l]

7 j = l+1 #

迴圈過程中保持 arr[lt+1...j) == v

8 lt = l #

迴圈過程中保持 arr[l+1...lt] < v

9 gt = r #

迴圈過程中保持 arr[gt...r] > v

10while j <=gt:

11if nums[j] 12 nums[lt], nums[j] =nums[j], nums[lt]

13 j += 1

14 lt += 1

15elif nums[j] >pivot:

16 nums[gt], nums[j] =nums[j], nums[gt]

17 gt -= 1

18else

:19 j += 1

2021

#devide

22 self._sortcolors(nums, l, lt-1)

23 self._sortcolors(nums, gt+1, r)

24def

sortcolors(self, nums):

25"""

26:type nums: list[int]

27:rtype: void do not return anything, modify nums in-place instead.

28"""

29 self._sortcolors(nums, 0, len(nums)-1)

leetcode 顏色分類

75顏色分類 給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0...

LeetCode 顏色分類

給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0,1,1,2,...

LeetCode 顏色分類

給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0,1,1,2,...