`

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;
    }
}
分享到:
评论

相关推荐

    js-leetcode题解之75-sort-colors.js

    javascript js_leetcode题解之75-sort-colors.js

    C语言-leetcode题解之75-sort-colors.c

    c语言入门 C语言_leetcode题解之75-sort-colors.c

    _leetcode-python.pdf

    - Sort Colors: 给定一个包含红色、白色和蓝色,一共n个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 - Combinations: 从n个不同元素中取出k个元素的组合。 - ...

    python-leetcode题解之075-Sort-Colors

    python python_leetcode题解之075_Sort_Colors

    c语言-leetcode题解之0075-sort-colors.zip

    c c语言_leetcode题解之0075_sort_colors.zip

    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_...

    leetcode-answer

    例如,对于“Sort Colors”(排序颜色)问题,可以利用双指针法,减少元素交换的次数,从而提高效率。 总的来说,“leetcode-answer”这个资源包是学习和提升Java编程技巧,特别是算法应用的宝贵材料。通过实践和...

    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

    python-leetcode面试题解之第75题颜色分类-题解.zip

    def sortColors(nums): left, right = 0, len(nums) - 1 while left if nums[left] == 0: left += 1 elif nums[left] == 2: nums[left], nums[right] = nums[right], nums[left] right -= 1 else: left +=...

    java-leetcode题解之第75题颜色分类.zip

    public void sortColors(int[] nums) { int left = 0, right = nums.length - 1; while (left ) { while (left [left] == 0) { // 遇到红色球,向右移动 left++; } while (left [right] == 2) { // 遇到蓝色...

Global site tag (gtag.js) - Google Analytics