`

Leetcode - Sort Colors

 
阅读更多
Given an array with n objects colored red, white or blue, sort them 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.

[分析] 此题就是排序至多有三种值的数组。自己的思路是通过遍历数组两次排序,第一次遍历将 0 全部放置在最前面一段,第二次遍历数组剩余元素将 1 放置在前面。 但这样做总觉得缺了什么,一定有只要遍历一次的做法。搜了下,果然。http://blog.csdn.net/zxzxy1988/article/details/8596144 即使遍历两次还有另一种非常朴素的做法,第一次遍历计数0,1,2 的出现个数,第二次遍历就是根据计数赋值数组。
仅遍历一次的思路参考博文中分析得非常到位,尤其是三指针含义的解释以及更新规则。low指示1元素的开始,是0和1的分界线,high指示1元素的结尾,是1和2的分界线,因为low指向的元素是1,所以每次和mid交换后low 和 mid均要递增,而high指针指向的元素可能是0可能是1,换句话说,[mid, high]之间是尚未遍历的区域, 因此high 和mid交换后mid不能递增。

public class Solution {
    // Method 2: scan only 1 time
    public void sortColors(int[] nums) {
        if (nums == null || nums.length == 0)
            return;
        int low = 0, mid = 0, high = nums.length - 1;
        while (mid <= high) {
            switch (nums[mid]) {
                case 0:
                    swap(nums, low++, mid++); break;
                case 1:
                    mid++; break;
                case 2:
                    swap(nums, high--, mid); break;
                default:
                    break;
            }
        }
    }
    
    // Method 1: scan 2 times
    public void sortColors1(int[] nums) {
        if (nums == null || nums.length == 0)
            return;
        int N = nums.length;
        int i = reorder(nums, 0, 0);
        if (i == N) return;
        reorder(nums, i, 1);
    }
    private int reorder(int[] nums, int i, int t) {
        int N = nums.length;
        while (i < N && nums[i] == t) {
            i++;
        }
        int j = i;
        while (true) {
            // find next 0
            while (j < N && nums[j] > t) {
                j++;
            }
            if (j == N) break;
            swap(nums, i, j);
            i++;
        }
        return i;
    }
    private void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}
分享到:
评论

相关推荐

    leetcode怎么销号-LeetCode-Solutions:我自己的LeetCode解决方案

    leetcode怎么销号 LeetCode-Solutions :green_heart:My own LeetCode solutions No. Problem LeetCode 力扣 Python Go Solution Difficulty Tag 0017 Letter Combinations of a Phone ...Sort Colors M

    leetcode卡-Leetcode-solutions:LeetCodeDS日常挑战的解决方案

    leetcode卡Leetcode-解决方案 LeetCode DS 日常挑战的解决方案 问题陈述 1.InvertBinaryTree - 2.子序列- 3.SearchInsertPosition - 4.SortColors - 5.单号——

    leetcode中国-leetcode-study:学习算法

    leetcode中国 leetcode-study 地址: 考虑维度 时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。 空间维度:是指执行当前...SortColors 贪心思想 给小孩分配饼干,最多分配多少个 AssignCook

    扩展矩阵leetcode-Leetcode:LeetcodeAnswer-Java

    扩展矩阵leetcode Leetcode Leetcode Answer-Java 数组 11.乘最多水容器 maxArea 26.删除排序数组中的重复项 removeDuplicates 33.搜索旋转排序数组 ...sortColors 179.最大数 largestNumber 324.摆

    多线程leetcode-LeetCode:某物

    _75_SortColors_twopointer _142_LinkedListCycle2_twopointer //////// 弗洛伊德循环检测 _287_FindtheDuplicateNumber_TwoPointer_Floyd _340_LongestSubstringwithAtMostKDistinctCharacters_TwoPointer _424_...

    javalruleetcode-LeetCode:LeetCode算法问题

    Colors LeetCode 125 Valid Palindrome LeetCode 167 Two Sum II - Input array is sorted LeetCode 344 Reverse String LeetCode 345 Reverse Vowels of a String 2 字符串 编号 题目 LeetCode 3 Longest Substring...

    LeetCode最全代码

    * [Sort](https://github.com/kamyu104/LeetCode#sort) * [Recursion](https://github.com/kamyu104/LeetCode#recursion) * [Binary Search](https://github.com/kamyu104/LeetCode#binary-search) * [Binary Search...

    leetcode2sumc-LeetCode_py:LeetCode_py

    SortColors 167 - TwoSum2 DCP 75 是一个双指针问题,如果当前项为 0,则使用 p1 p2 指向开始和结束,然后与开始交换,如果当前项目为 2,则与结束交换。 167是同一个想法 02/01/2020 16 -3SumClosest 344 - Reverse...

    leetcode2-DSA-problems-solutions:DSA-问题-解决方案

    (Sort_Colors) 重复和缺失号码 (Repeat_And_Missing_Number) 在没有额外空间的情况下合并两个已排序的数组 (Merge_Sorted_Arrays) Kadane 的算法 (Kadane's_Algorithm) 合并重叠子区间(Merge_Overlapping_SubInterv)...

    leetcode招聘-algorithm:算法

    sortcolors: 对三种颜色的方块排序 water: 不同高度的台阶,能够蓄水多少 quicksort: 面试必考之一,快速排序 heapsort: 堆排序算法 B+tree: B+树 RedBlackTree:红黑树 AVLTree: 自平衡的二叉查找数 Dijkstra:最短...

    leetcode中国-quiz:每周小测

    leetcode中国 每周小测 每周题目 week 1 adjust : 将数组中指定索引处的值替换为经函数变换的值 实现版本: ramda版本参考: groupAnagrams ...给定一个字符串数组,将字母异位词组合在一起。...sortColors

    lrucacheleetcode-LeetCodeSheet:记录自己Leetcode之旅

    Colors Leetcode 215. Kth Largest Element Leetcode 4. Median of Two Sorted Arrays 注意:后两题是与快速排序非常相似的快速选择(Quick Select)算法,面试中很常考 链表类(Linked List): 基础知识:链表如何...

    Leetcode经典01背包-algo:一些记录

    Leetcode经典01背包 algo 1. 数据结构与算法 数组,链表,(串和序列) 堆,栈,队列 树,图 排序,搜索 贪心,回溯,动态规划 堆:一种完全二叉树,任意节点大于左右孩子(大顶堆...Colors 计数排序 | | | 88 Merge So

    leetcode

    排序颜色: ://leetcode.com/problems/sort-colors/ 3index,nums [0-zero] = 0,nums [zero + 1,two-1] = 1,nums [two-n] = 2,用3个索引,nums [0-zero] = 0,nums [零+1,two-1] = 1,nums [two-n] = 2,初始...

    cpp-算法精粹

    Sort Colors Kth Largest Element in an Array 桶排序 First Missing Positive 计数排序 H-Index 基数排序 Maximum Gap 其他 Largest Number 小结 查找 Search for a Range Search Insert Position Search in ...

Global site tag (gtag.js) - Google Analytics