leetcode 分類顏色
給定乙個包含紅色、白色和藍色,一共 n 個元素的陣列,原地
對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。
注意:
不能使用**庫中的排序函式來解決這道題。
示例:
輸入: [2,0,2,1,1,0]高階:輸出: [0,0,1,1,2,2]
1. 使用基數排序:
1class
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的正確位置
1class
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]兩部分進行三路快排即可
1class
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,...