【LeetCode】75. 颜色分类
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
进阶:
一个直观的解决方案是使用计数排序的两趟扫描算法。
首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
你能想出一个仅使用常数空间的一趟扫描算法吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-colors
解法1:这题因为就三个数,我的想法也比较简单,声明一个长度相同,全为1的一维数组one。两个变量,m=0,n=len(nums)-1.
一趟扫描,遇0则one[m]=0,m++;遇2则one[n]=2,n--.最后的One即为最后的答案。
class Solution(object): def sortColors(self, nums): """ :type nums: List[int] :rtype: None Do not return anything, modify nums in-place instead. """ len_s = len(nums) one = [1] * len_s m = 0 n = len_s - 1 for i in range(len_s): if nums[i] == 0: one[m] = 0 m += 1 elif nums[i] == 2: one[n] = 2 n -= 1 for i in range(len_s): nums[i] = one[i]
解法2:利用快速排序的思想,开三个变量,zero=0,two=len(nums),i=0.
在nums上进行扫描,i为循环的变量。此题三种情况,比较简单直接附代码。
class Solution(object): def sortColors(self, nums): """ :type nums: List[int] :rtype: None Do not return anything, modify nums in-place instead. """ def swap(nums, index1, index2): nums[index1], nums[index2] = nums[index2], nums[index1] size = len(nums) if size < 2: return zero = 0 two = size i = 0 while i < two: if nums[i] == 0: swap(nums, i, zero) i += 1 zero += 1 elif nums[i] == 1: i += 1 else: two -= 1 swap(nums, i, two)
浙公网安备 33010602011771号