• 【LeetCode】【定制版排序】Sort Colors


    之前转载过一篇STL的sort方法底层详解的博客:https://www.cnblogs.com/ygh1229/articles/9806398.html

    但是我们在开发中会根据自己特定的应用,有新的排序需求,比如下面这道题,当只有0,1,2这三个数字时的排序,我们就可以自己写定制版的排序算法

    描述

    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?

    思路一 标识位移动

    我们定义 Low, Mid and High.

        1 0 2 2 1 0
        ^         ^
        L         H
        M
    
        Mid != 0 || 2
        Mid++
    
        1 0 2 2 1 0
        ^ ^       ^
        L M       H
    
        Mid == 0
        Swap Low and Mid
        Mid++
        Low++
    
        0 1 2 2 1 0
          ^ ^     ^
          L M     H
    
        Mid == 2
        Swap High and Mid
        High--
    
        0 1 0 2 1 2
          ^ ^   ^
          L M   H
    
        Mid == 0
        Swap Low and Mid
        Mid++
        Low++
    
        0 0 1 2 1 2
            ^ ^ ^
            L M H
    
        Mid == 2
        Swap High and Mid
        High--
    
        0 0 1 1 2 2
            ^ ^
            L M
              H
    
        Mid <= High is our exit case

    依照此思路,算法解答如下

    class Solution {
    public:
        void sortColors(vector<int>& nums) 
        {
            int tmp = 0, low = 0, mid = 0, high = nums.size() - 1;
        
            while(mid <= high)
            {
                if(nums[mid] == 0)
                {
                    tmp = nums[low];
                    nums[low] = nums[mid];
                    nums[mid] = tmp;
                    low++;
                    mid++;
                }
                else if(nums[mid] == 1)
                {
                    mid++;
                }
                else if(nums[mid] == 2)
                {
                    tmp = nums[high];
                    nums[high] = nums[mid];
                    nums[mid] = tmp;
                    high--;
                }
            }
        }
    };

     思路三  优化

    优化为只找序列中的0,2并且每次移位都要移彻底,调换位置后可能还会出现0,2,所以在while中位移完全结束后才继续向前执行。

    class Solution {
    public:
        void sortColors(vector<int>& nums) {
            int low = 0, high = nums.size() - 1;
            for(int i = 0;i<=high;++i){
                while (nums[i]==2 && i<high) swap(nums[i], nums[high--]);
                while (nums[i]==0 && i>low) swap(nums[i], nums[low++]);
            }
        }
    };
  • 相关阅读:
    Hit Event 击中碰撞
    基于ReentrantLock通知唤醒的生产消费模式
    spring 源码构建
    读写分离、分库、分表
    python 反射的使用
    基础算法
    git 命令使用
    java设计模式应用
    linux 中python的使用
    linux命令
  • 原文地址:https://www.cnblogs.com/ygh1229/p/9809499.html
Copyright © 2020-2023  润新知