程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

yield(0)

面向对象(0)

标签  

字典(0)

列表(0)

日期归档  

2023-06(2)

LeetCode-75.颜色分类

发布于2020-02-24 22:58     阅读(717)     评论(0)     点赞(6)     收藏(0)


难度:中等
描述:给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意: 不能使用代码库中的排序函数来解决这道题。
示例:

输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
  • 1
  • 2

进阶:

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

解法1:
计数排序,需遍历两边数组。

# 时间复杂度O(n)
# 空间复杂度O(3)
class Solution:
    def sortColors(self, nums):
        count = [0] * 3
        for i in nums:
            count[i] += 1
        for i in range(len(nums)):
            if i < count[0]:
                nums[i] = 0
            if i >= count[0] and i < count[0]+count[1]:
                nums[i] = 1
            if i >= count[1]+count[0]:
                nums[i] = 2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

解法2:
使用三路快速排序的思想,只需遍历一遍数组。

# 时间复杂度O(n)
# 空间复杂度O(1)
class Solution:
    def sortColors(self, nums):
        zero = 0
        two = len(nums) - 1
        i = 0
        while i <= two:
            if nums[i] == 1:
                i += 1
            elif nums[i] == 0:
                nums[i], nums[zero] = nums[zero], nums[i]
                zero += 1
                i += 1
            else:
                nums[i], nums[two] = nums[two], nums[i]
                two -= 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
发布了17 篇原创文章 · 获赞 1 · 访问量 1万+


所属网站分类: 技术文章 > 博客

作者:goodbody

链接:https://www.pythonheidong.com/blog/article/232709/b865d3e6cbe9aaf433fd/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

6 0
收藏该文
已收藏

评论内容:(最多支持255个字符)