【leetcode刷题】20T39-颜色分类

  • 2020 年 3 月 31 日
  • 筆記

木又同学2020年第39篇解题报告

leetcode第75题:颜色分类

https://leetcode-cn.com/problems/sort-color


【题目】

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

注意: 不能使用代码库中的排序函数来解决这道题。

示例:  输入: [2,0,2,1,1,0]  输出: [0,0,1,1,2,2]

进阶:

一个直观的解决方案是使用计数排序的两趟扫描算法。 首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。 你能想出一个仅使用常数空间的一趟扫描算法吗?

【思路】

使用left和right存储0和2的个数。

遍历数组,如果nums[i]为2,则交换nums[i]和nums[-right-1],使得最后right个元素都为2,同时right自增;如果nums[i]为0,则交换nums[i]和nums[left],使得最前left个元素都为0,同时left自增。

【代码】

python版本

class Solution(object):      def sortColors(self, nums):          """          :type nums: List[int]          :rtype: None Do not return anything, modify nums in-place instead.          """          if len(nums) < 2:              return nums            left, right = 0, len(nums) - 1          i = 0          while i <= right:              # 等于0,nums[i]和nums[left]替换              if nums[i] == 0:                  nums[i] = 1                  nums[left] = 0                  left += 1              # 等于2,nums[i]和nums[right]替换              elif nums[i] == 2:                  nums[i] = nums[right]                  nums[right] = 2                  right -= 1                  i -= 1              i += 1