75.颜色分类
75.颜色分类
方法一:冒泡排序
class Solution:def sortColors(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""## 按照红、白、蓝的顺序排序。其实就是实现数组的单调递增排序# 1. 冒泡排序。时间复杂度O(n2)if len(nums) <= 1:return numsfor i in range(len(nums)): # 确保每个元素一次冒泡swapped = Falsefor j in range(len(nums)-1-i): # 已冒泡到上层的不需要再遍历了if nums[j] > nums[j+1]:nums[j], nums[j+1] = nums[j+1], nums[j]swapped = Trueif not swapped:break
方法二:计数排序
class Solution:def sortColors(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""## 2. 计数排序:以一个长度为3数组来统计红绿蓝出现的频次,根据频次重新设置nums数组count_list = [0] * 3for ele in nums:count_list[ele] += 1index = 0for i in range(len(count_list)):while count_list[i] != 0:nums[index] = icount_list[i] -= 1index += 1
方法三:partition算法
三向划分
思路
- 维护三个指针(或理解为三个区域的边界):
- p0:0 的右边界([0, p0) 区间是 0)
- p2:2 的左边界((p2, n-1] 区间是 2)
- curr:当前正在查看的元素
Code
class Solution:def sortColors(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""p0 = 0 cur = 0 ### cur指针 >= p0p2 = len(nums)-1while cur <= p2:if nums[cur] == 0:nums[p0], nums[cur] = nums[cur], nums[p0]p0 += 1cur += 1 ### 因为是从左向右遍历的,这里一定能确保[0:p0)都为0,故cur要+1去遍历下一个元素elif nums[cur] == 2: ### 确保(p2:]都为2nums[p2], nums[cur] = nums[cur], nums[p2]p2 -= 1 ### 这里不能cur ++,因为是从左向右遍历每个元素,当前交换后的这个元素也要进行判断,cur++的话就跳过了对交换后这个元素的判断else: ### 确保[p0:p2]都为1cur += 1 ### 遇到1的,保留在中间