Lintcode 148 Sort Colors (双指针好题)

148 · Sort Colors

Description
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.
You are not suppose to use the library’s sort function for this problem.
You should do it in-place (sort numbers in the original array).
You are not allowed to use counting sort to solve this problem.

Example 1

Input : [1, 0, 1, 2]
Output : [0, 1, 1, 2]
Explanation : sort it in-place
Challenge
Could you come up with an one-pass algorithm using only O(1) space?

Show Hint
Related Knowledge
学习《算法——双指针思想》课程中的2.8双指针思想练习2相关内容 ,了解更多相关知识!
Tags
Related Problems

507
Wiggle Sort II
Hard

39
Recover Rotated Sorted Array
Easy

143
Sort Colors II
Medium

508
Wiggle Sort
Medium

625
Partition Array II
Medium

解法1:双指针

class Solution {
public:
    /**
     * @param nums: A list of integer which is 0, 1 or 2
     * @return: nothing
     */
    void sortColors(vector<int> &nums) {
        int n = nums.size();
        //RED 0, WHITE 1, BLUE 2
        //Before each iteration in white loop:
        //  [0..red) are red 0
        //  [red..index) are white 1
        //  [index..blue] are unknown
        //  (blue..n-1] are blue 2
        int red = 0, index = 0, blue = n - 1;
        while (index <= blue) {  //注意:这里不是index
            if (nums[index] == 0) {
                swap(nums[red], nums[index]); //nums[red]已经扫描过,一定是1,所以可以动index
                red++; index++;
            } else if (nums[index] == 1) {
                index++;
            } else { //nums[index] == 2
                swap(nums[blue], nums[index]); //nums[blue]还没有扫描过,可能是0,1,2,所以不能动index
                blue--;
            }
        }
        return;
    }
};

你可能感兴趣的:(leetcode)