Leetcode第75題 顏色分類(荷蘭國旗問題)

2021-09-30 18:33:51 字數 2659 閱讀 9618

給定乙個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。

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

注意:不能使用**庫中的排序函式來解決這道題。(真香警告.jpg)

示例:

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

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

高階:

荷蘭國旗問題,基本上每本演算法書上都會提到,最常見效率也最高的就是快速排序的變種,演算法思想跟快速排序很類似,中間的是某個元素,左邊都比該元素小,右邊都比該元素大。

定義三個指標left=-1,mid=0,right=nums.size。

mid從頭到尾遍歷nums

遇到0,mid與left位置的元素交換,++left,因為left=right為迴圈結束條件,mid無需自增

遇到1,1在中間mid位置很正常,繼續向後,++mid

這種演算法思想的時空複雜度為o(n)和o(1),而且適用性更好,即便換成超過3種元素的陣列依然適用。

定義乙個長度為3的陣列,掃瞄一次nums記錄0、1、2的個數,然後依據這個陣列重新對num進行賦值。

這種演算法思想的時空複雜度為o(n)和o(1)。

執行結果:0ms,100%。

(自帶函式**好,swap函式寫的都比我效率高)

class solution 

return;}

};

執行結果:44ms,99.92%。

這個len()不是類裡面的方法用著真的不習慣,而且python也不支援++/–,還有就是swap方式總感覺怪怪的…

class

solution

:def

sortcolors

(self, nums)

:"""

:type nums: list[int]

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

"""#荷蘭國旗問題

#快速排序的變種

#中間為1,左邊為0都比1小,右邊為2都比1大

left=-1

mid=

0 right=

len(nums)

''' mid從頭到尾遍歷nums

遇到0,mid與left位置的元素交換,++left,因為left=right為迴圈結束條件,mid無需自增

遇到1,1在中間mid位置很正常,繼續向後,++mid

'''while midif nums[mid]==0

: left+=

1 nums[left]

,nums[mid]

=nums[mid]

,nums[left]

mid+=

1elif nums[mid]==2

: right-=

1 nums[mid]

,nums[right]

=nums[right]

,nums[mid]

else

:#nums[mid]==1

mid+=

1return

;

執行結果:4ms,84.14%。

class solution 

}//重新賦值nums

for(

int i=

0;i;++i)

for(

int i=

0;i;++i)

for(

int i=

0;i;++i)

return;}

};

執行結果:44ms,99.92%。

原來python的切片操作可以這麼優雅的迴圈賦值的…

class

solution

:def

sortcolors

(self, nums)

:"""

:type nums: list[int]

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

"""#荷蘭國旗問題

#遍歷陣列計算0、1和2的數量

arr=[0

]*3for num in nums:

if num==0:

arr[0]

+=1elif num==1:

arr[1]

+=1elif num==2:

arr[2]

+=1#重新賦值nums

nums[

0:arr[0]

]=[0

]*arr[0]

nums[arr[0]

:arr[1]

]=[1

]*arr[1]

nums[arr[0]

+arr[1]

:]=[

2]*arr[2]

return

;

1、快速排序(1) – 荷蘭國旗問題

leetcode 第75題 顏色分類 (雙指標)

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

第75題 顏色分類

75.顏色分類 第一眼看過去,這不就是陣列的排序嗎0.0 方法一 直接用庫函式排序。方法二 單指標 兩次遍歷。方法三 雙指標 一次遍歷。方法一 直接用庫函式排序。class solution 方法二 單指標 兩次遍歷 class solution public static void sortcol...

LeetCode刷題 (75) 顏色分類

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