leetcode--75--颜色分类

题目描述:

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

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

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

示例:

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

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


解题思路1:

  1. 利用 numpy中的 unique进行列表去重
  2. 去重之后的元素进行排序
  3. 判断去重后每个元素的数量
  4. 根据元素数量的不同依次写入

代码1:

import numpy as np
class Solution(object):
    def sortColors(self, nums):
        Lis = []
        number = np.unique(nums)         # 去重

        for i in range(len(number)-1):   # 去重后的排序
            if number[i] > number[i+1]:
                temp = number[i]
                number[i] = number[i+1]
                number[i+1] = temp

        for i in range(len(number)):     # 判断去重后每个元素的数量
            counti = 0
            for j in range(len(nums)):
                if number[i] == nums[j]:
                    counti += 1
            for k in range(counti):      # 根据元素的数量依次写入即可
                Lis.append(number[i])

        return Lis

s = Solution()
nums = [2, 0, 2, 1, 1, 0]
print(s.sortColors(nums))

解题思路2:

核心思想是对列表元素进行排序,依次进行比较即可


代码2:

class Solution(object):
    def sortColors(self, nums):

        size = len(nums)
        for i in range(size-1):
            for j in range(i, size):
                if nums[i] > nums[j]:
                    nums[i], nums[j] = nums[j], nums[i]
        return nums

s = Solution()
nums = [2, 0, 2, 1, 1, 0]
print(s.sortColors(nums))

解题思路3:

思路与上述解题思路相同,只是代码写法处稍有不同,来源于:leetcode–75–颜色分类


代码3:

class Solution(object):
    def sortColors(self, nums):
        size = len(nums)

        for i in range(size-1):
            for j in range(size-1-i):
                if nums[j] > nums[j+1]:
                    nums[j], nums[j+1] = nums[j+1], nums[j]

s = Solution()
nums = [2, 0, 2, 1, 1, 0]
print(s.sortColors(nums))

题目来源:
https://leetcode-cn.com/problems/sort-colors

发布了333 篇原创文章 · 获赞 36 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43283397/article/details/104873576