2018-12-21

LeetCode 75. Sort Colors.jpg

LeetCode 75. Sort Colors

Description

Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue.

Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.

Note: You are not suppose to use the library's sort function for this problem.

Example:

Input: [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]
Follow up:

A rather straight forward solution is a two-pass algorithm using counting sort.
First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's.
Could you come up with a one-pass algorithm using only constant space?

描述

给定一个具有红色,白色或蓝色的n个对象的数组,对它们进行就地排序,使相同颜色的对象相邻,颜色顺序为红色,白色和蓝色。

这里,我们将使用整数0,1和2分别表示红色,白色和蓝色。

注意:您不应该使用库的排序功能来解决此问题。

思路

  • 此题题意是给定三种不同的数,按照从小到大顺序排序.
  • 不能使用库函数.
  • 额外要求:时间复杂度:仅遍历一趟数组,空间:O(1).
  • 我们用zero来记录已经到达最终位置的0的下一个索引.
  • 我们用one 来记录已经到达最终位置的1的下一个索引.
  • 即nums[0:zero-1]全部是0,且它们已经到达了最终的位置.
  • nums[zero:one-1]全部是1,且他们已经到达了最终的位置.
  • 我们从one开始遍历数组

若nums[i]==0

  • 则把已经到达最终位置的1的后一个元素num[one]付给nums[i]
  • 把已经到达最终位置的0的后一个元素num|[zero]给nums[one]
  • 把nums[zero]置为0

若nums[i]==1

  • 则把已经到达最终位置的1的后一个元素num[one]付给nums[i]
  • 把nums[one]置为1
class Solution:
    def sortColors(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        if not nums:
            return
        # zero表示已经到达最终位置的0的下一个位置
        # nums[0:zero-1]之间的数字都是0,它们都已经到达了最终位置
        # one 表示已经到达最终位置的1的下一个位置
        # nums[zero:one-1]之间的数字都是1,它们都已经到达了最终位置
        zero, one, length = 0, 0, len(nums)
        # 只需要遍历一次
        for i in range(length):
            if nums[i] == 0:
                # 如果当前是0,则把当前位置的值置为nums[one],把nums[one]置为nums[zero]
                # 把nums[zero]置为0
                nums[i], nums[one], nums[zero] = nums[one], nums[zero], 0
                zero += 1
                one += 1
            # 如果当前位置是1,则把当前位置置为nums[one],把nums[one]置为0
            elif nums[i] == 1:
                nums[i], nums[one] = nums[one], 1
                one += 1

源代码文件在这里.
©本文首发于何睿的博客,欢迎转载,转载需保留文章来源,作者信息和本声明.

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 12,168评论 0 10
  • 为什么忙碌也阻止不了我的胡思乱想,看来还是生活太清闲了
    enature阅读 694评论 0 0
  • 2018.3.21 星期三 晴 今天的温度挺低的,儿子下午武术训练了,到家后两手冻得通红,扎凉,倒点热水让他...
    鑫隆妈妈阅读 1,499评论 1 1
  • 本以为会非常的复杂,后来做起来却发现并不难,只是有些巧妙的地方要注意。可填可选的输入框是由一个input text...
    啊啊啊阿南阅读 8,438评论 0 0
  • 有人说,干活打工,要懂得怎么跳槽,通过跳槽越跳越好。但是频繁跳槽的人,老板不一定喜欢。遇到合用的员工,老板肯定是希...
    亢奋的蘑菇阅读 1,882评论 0 4

友情链接更多精彩内容