lintcode(148)颜色分

来源:互联网 发布:为知笔记转印象笔记 编辑:程序博客网 时间:2024/06/05 22:44

Description:

给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红、白、蓝的顺序进行排序。

我们可以使用整数 0,1 和 2 分别代表红,白,蓝。

 注意事项

不能使用代码库中的排序函数来解决这个问题。
排序需要在原数组中进行。

一个相当直接的解决方案是使用计数排序扫描2遍的算法。

首先,迭代数组计算 0,1,2 出现的次数,然后依次用 0,1,2 出现的次数去覆盖数组。

你否能想出一个仅使用常数级额外空间复杂度且只扫描遍历一遍数组的算法?

Explanation:

给你数组 [1, 0, 1, 2], 需要将该数组原地排序为 [0, 1, 1, 2]

Solution:

使用两根指针,只享首尾,如果当前值为0,则和前边指针指向的成员交换,并且指针向后移,当前值为1则下一位,当前值为2则和后面的指针交换,指针前移。

class Solution {    /**     * @param nums: A list of integer which is 0, 1 or 2      * @return: nothing     */    public void sortColors(int[] nums) {        // write your code here        if(nums == null || nums.length == 0 || nums.length == 1) return;        int left = 0;        int right = nums.length - 1;        int index = 0;        while(index <= right){            if(nums[index] < 1){                swap(nums , left , index);                left++;                index++;            }else if(nums[index] > 1){                swap(nums , right , index);                right--;            }else{                index++;            }        }    }        public void swap(int[] nums , int start , int end){        int temp = nums[start];        nums[start] = nums[end];        nums[end] = temp;        return ;    }}



原创粉丝点击