Lintcode阶梯训练~算法

颜色排序

2017-06-27  本文已影响25人  lyoungzzz

描述

给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红、白、蓝的顺序进行排序。
我们可以使用整数 0,1 和 2 分别代表红,白,蓝。

样例

数组 [1, 0, 1, 2], 将该数组原地排序为 [0, 1, 1, 2]。

标签

数组&排序&双指针

相关题目

分割数组 & 摆动排序 & 摆动排序2 & 颜色排序2

代码实现

class Solution {
    /**
     * @param nums: A list of integer which is 0, 1 or 2 
     * @return: nothing
     * 
     * 假设数组nums 索引值0之前全是0,索引值nums.length-1右边全是2
     * 
     */
    public void sortColors(int[] nums) {
        if (nums == null || nums.length == 0) {
            return;
        }
        int left = 0;
        int right = nums.length-1;
        int i = 0;
        while (i <= right) {
            //i=right有可能需要再进行调换,因为有可能原始的最后一个是2,被调换至前面
            if (nums[i] == 1) {
                i++;
            } else if(nums[i] == 0) {
                swap(nums, i, left);
                left++;
                i++;
            } else {
                swap(nums, i, right);
                right--;
                /* 不能i++,因为从右调过来的数可能是0 或者2
                *i++就 会直接跳过
                */
            }
        }
    }
    private void swap(int[] a,int i,int j) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}
上一篇下一篇

猜你喜欢

热点阅读