LeetCode 75. Sort Colors

来源:互联网 发布:java 停止线程 编辑:程序博客网 时间:2024/04/30 14:48

1. 题目描述

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.

Note:
You are not suppose to use the library’s sort function for this problem.

click to show follow up.

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 an one-pass algorithm using only constant space?

2. 解题思路

拿到这个问题, 我们首先想到的是用计数排序可以直接处理, 不过提示中说不要这样做, 而且指明要求使用一种算法, one-pass, constant space.。 我们想到, 可以模拟快速排序, 快速排序实际上就是把小于给定的值的数据丢到一侧, 把大于给定值的数据丢到另外一侧。
这道题目中, 我们也可以这么处理, 把 0 丢到左侧, 把 2 丢到右侧, 即可

3. code

class Solution {public:    void sortColors(vector<int>& nums) {        int start = 0, stop = nums.size() - 1, cur = 0;        while (cur <= stop){            if (nums[cur] == 0){                // 特殊处理 当cur == start 就不需要交换数据了                if (cur == start){                    cur++, start++;                }                else                    swap(nums[cur], nums[start++]);            }            else if (nums[cur] == 2){                swap(nums[cur], nums[stop--]);            }            else{                cur++;            }        }    }};

4. 大神解法

一样的思路

/*The idea is to sweep all 0s to the left and all 2s to the right, then all 1s are left in the middle.*/    class Solution {    public:        void sortColors(int A[], int n) {            int second=n-1, zero=0;            for (int i=0; i<=second; i++) {                while (A[i]==2 && i<second) swap(A[i], A[second--]);                while (A[i]==0 && i>zero) swap(A[i], A[zero++]);            }        }    };
0 0
原创粉丝点击