Day40 颜色分类

作者: Shimmer_ | 来源:发表于2021-03-06 14:41 被阅读0次

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

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

    我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色

    示例1:

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

    示例2:

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

    示例3:

    输入:nums = [0]
    输出:[0]

    示例4:

    输入:nums = [1]
    输出:[1]

    提示:

    n == nums.length
    1 <= n <= 300
    nums[i] 为 0、1 或 2

    Java解法

    思路:

    • 看起来用双指针处理,分别指向前后的位置,遍历时针对0,2进行替换,直到遍历到末尾指针时,一把过NICE!
    package sj.shimmer.algorithm.m2;
    
    import sj.shimmer.algorithm.Utils;
    
    /**
     * Created by SJ on 2021/3/5.
     */
    
    class D40 {
        public static void main(String[] args) {
    //        int[] nums = {2, 0, 2, 1, 1, 0};
    //        int[] nums = {2,0,1};
            int[] nums = {0};
            sortColors(nums);
            Utils.logArray(nums);
        }
    
        public static void sortColors(int[] nums) {
            if (nums == null) {
                return;
            }
            int length = nums.length;
            int left = -1;
            int right = length;
            int index = 0;
            int temp = 0;
            while (index < length) {
                if (nums[index] == 0&&index>left) {
                    left++;
                    temp = nums[left];
                    nums[left] = nums[index];
                    nums[index] = temp;
                } else if (nums[index] == 2&&index<right) {
                    right--;
                    temp = nums[right];
                    nums[right] = nums[index];
                    nums[index] = temp;
                } else {
                    index++;
                }
            }
        }
    }
    
    image

    官方解

    https://leetcode-cn.com/problems/sort-colors/solution/yan-se-fen-lei-by-leetcode-solution/

    1. 单指针

      二次遍历

      • 遍历找出头部位置界限
      • 遍历将 0 交换至头部最开始,头部界限后移
      • 时间复杂度:O(n)
      • 空间复杂度:O(1)
    2. 双指针

      解法一:

      都从左边开始交换,p0交换0,p1交换1,这里注意只有p0小于p1的时候才能交换p0(避免把1换出去)

      解法二:

      我的思路,两边开始交换

      • 时间复杂度:O(n)
      • 空间复杂度:O(1)

    相关文章

      网友评论

        本文标题:Day40 颜色分类

        本文链接:https://www.haomeiwen.com/subject/yxtsqltx.html