75. Sort Colors

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?

one pass + two pointers

把数组划分为3个区域,< 1,=1,>1,用两个指针p1, p2分别表示 小于区 和 大于区。从左往右遍历数组,如果:

当前数< 1:交换当前数与小于区最右的数nums[p1],小于区向右扩大一位,当前数移动至下一个。

当前数> 1:交换当前数与大于区最左的数nums[p2],大于区向左扩大一位,当前数留在原地。

当前数= 1:当前数移动至下一个。

直到当前数的下标大于 大于区最左元素的下标,循环结束。

时间:O(N),空间:O(1)

class Solution {
    public void sortColors(int[] nums) {
        if(nums.length < 2) return;
        int p1 = 0, p2 = nums.length - 1, i = 0;
        while(i <= p2) {
            if(nums[i] < 1)
                swap(nums, i++, p1++);
            else if(nums[i] > 1)
                swap(nums, i, p2--);
            else
                i++;
        }
    }
    
    private void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}

二刷:

basic idea: use two pointer and sort the array in one-pass

Divide the array into three parts: < 1, = 1, > 1. Then use two pointers p1, p2 to represent the three parts, p1 is initialized to be at index 0, and p2 is at the last position of the array. Iterate  the array from left to right: if current number < 1, then swap current number with the number that p1 points to, move p1 to the right, and go to the next number; if = 1, skip to the next number; if > 1, swap current number with the number that p2 points to, and move p2 to the left.

time = O(n), space = O(1)

class Solution {
    public void sortColors(int[] nums) {
        if(nums == null || nums.length == 0) {
            return;
        }
        int p1 = 0, p2 = nums.length - 1, i = 0;
        while(i <= p2) {
            if(nums[i] < 1) {
                swap(nums, i++, p1++);
            } else if(nums[i] == 1) {
                i++;
            } else {
                swap(nums, i, p2--);
            }
        }
    }
    
    public void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}
原文地址:https://www.cnblogs.com/fatttcat/p/10059690.html