Facebook面试题专题4 - leetcode75. Sort Colors

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a786150017/article/details/84899618

75. Sort Colors

英语流利说面试题

题目描述

(三色排序)给出一个由红、白、蓝三种颜色组成的数组,把相同颜色的元素放到一起,并整体按照红、白、蓝的顺序。用0表示红色,1表示白色,2表示蓝色。

例子

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

思想
(法1) - 遍历两遍
第一遍可以用三个指针分别对0、1和2进行计数;第二遍赋值
(法2) - 三指针

如果只有两种颜色,那么容易想到一前一后两个指针向中间遍历,颜色不对就交换位置。

三种颜色仍然可以这么做,只不过要多一个指针,前后两个指针用来分隔已经排好的0和2(保证两指针区间的前面都是0,后面都是2),中间的指针来遍历元素。
1)nums[mid]为2,和nums[r]的交换,且更新r -= 1;
2)nums[mid]为1,不需要交换,更新mid += 1;
3)nums[mid]为0,和nums[l]的交换,且更新l += 1。

假设nums[mid]=0,若mid=l,需要同时右移;若mid > l,则【0,1…l-1】都是0,【l… mid -1】都是1,nums[l]肯定是1。3)中与nums[l]交换后nums[mid]肯定为1,需要更新一下。

解法
(改进版)

class Solution(object):
    def sortColors(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        l = mid = 0
        r = len(nums)-1
        while mid <= r:
            if nums[mid] == 0:
                nums[l], nums[mid] = nums[mid], nums[l]
                l += 1
                mid += 1
            elif nums[mid] == 2:
                nums[r], nums[mid] = nums[mid], nums[r]
                r -= 1
            else:
                mid += 1

易懂版

class Solution(object):
    def sortColors(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        l = mid = 0
        r = len(nums)-1
        while mid <= r:
            if nums[mid] == 0:
                if mid == l:
                    mid += 1
                    l += 1
                else:
                    nums[l], nums[mid] = nums[mid], nums[l]
                    l += 1    # nums[mid]值为1, 下一轮需要mid+=1
            elif nums[mid] == 2:
                nums[r], nums[mid] = nums[mid], nums[r]
                r -= 1
            else:
                mid += 1

More
脑子转不过来,想了很久mid+=1的原因。可以先直接用(拙劣易懂版)做

猜你喜欢

转载自blog.csdn.net/a786150017/article/details/84899618
今日推荐