排颜色问题——数组 leetcode lintcode

问题描述:

给一个数组,并且数组里面元素的值只可能是0,1,2,然后现在把这个数组排序。

另外一种表述: 现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右,依次是一些红球、一些白球、一些蓝球。

解题思路:

采用快速排序partition的思想,用两个指针将三种颜色间隔开。

下面引用此处内容 July 编程艺术系列中荷兰国旗问题。

一个前指针begin,一个中指针current,一个后指针end,current指针遍历整个数组序列,当

  • current指针所指元素为0时,与begin指针所指的元素交换,而后current++,begin++ ;
  • current指针所指元素为1时,不做任何交换(即球不动),而后current++ ;
  • current指针所指元素为2时,与end指针所指的元素交换,而后,current指针不动,end-- 。

为什么上述第3点中,current指针所指元素为2时,与end指针所指元素交换之后,current指针不能动呢?因为第三步中current指针所指元素与end指针所指元素交换之前,如果end指针之前指的元素是0,那么与current指针所指元素交换之后,current指针此刻所指的元素是0,此时,current指针能动么?不能动,因为如上述第1点所述,如果current指针所指的元素是0,还得与begin指针所指的元素交换。

参考代码:

class Solution{
public:
    /**
     * @param nums: A list of integer which is 0, 1 or 2
     * @return: nothing
     */
    void sortColors(vector<int> &nums) {
        // write your code here
        int begin=0, cur = 0;
        int end = nums.size()-1;
        //0—红 1—白 2—蓝
        while(cur <= end)
        {
            if(nums[cur] ==0)
            {
                swap(nums[begin], nums[cur]);
                begin++;
                cur++;

            }else if(nums[cur] == 1)
            {
                cur++;

            }else if(nums[cur] == 2)
            {
                swap(nums[cur], nums[end]);
                end--;
            }
        }

    }
    //交换函数
    void swap(int &a, int &b)
    {
        int temp = a;
        a = b;
        b = temp;
    }
};
时间: 2024-10-10 08:45:35

排颜色问题——数组 leetcode lintcode的相关文章

lintcode:排颜色 II

排颜色 II 给定一个有n个对象(包括k种不同的颜色,并按照1到k进行编号)的数组,将对象进行分类使相同颜色的对象相邻,并按照1,2,...k的顺序进行排序. 样例 给出colors=[3, 2, 2, 1, 4],k=4, 你的代码应该在原地操作使得数组变成[1, 2, 2, 3, 4] 解题 直接快排 class Solution { /** * @param colors: A list of integer * @param k: An integer * @return: nothin

已经排好的数组,输入一个数,按原来的规律插入数组中;

//已经排好的数组,输入一个数,按原来的规律插入数组中; #include<iostream> using namespace std; int main() { int a[100]; int i,k,t; for(i=0;i<99;++i)/*-------------------------------赋值*/ a[i]=(i+1)*2; for(i=0;i<99;++i) { cout<<a[i]<<" "; if((i+1)%1

63.如何对单链表进行快排?和数组快排的分析与对比[quicksort of array and linked list]

[本文链接] http://www.cnblogs.com/hellogiser/p/quick-sort-of-array-and-linked-list.html [题目] 单链表的特点是:单向.设头结点位head,则最后一个节点的next指向NULL.如果只知道头结点head,请问怎么将该链表排序? [分析] 对于数组的快排:有2种方式. (1)指针相向移动:一个指针i指向头,一个指针j指向尾,然后两个指针相向运动并按一定规律交换值,最后找到一个支点p使得支点左边的值小于支点,支点右边的值

as3.0 小代码(1)------ 颜色渐变中的颜色渐变数组产生算法

//分离:如0xefebec  变成[0xec,0xeb,oxef] function colorValTransfer(inNum:uint):Array{ if(inNum>0xffffff){ throw new Error("Function:colorValTransfer parameter:inNum>>>parameter's value must be smaller than 0xffffff"); } var outArr = []; ou

九章算法面试题70 排颜色II sort colors

九章算法官网-原文网址 http://www.jiuzhang.com/problem/71/ 题目 给定一个有n个对象(包括k种不同的颜色,并按照1到k进行编号)的数组,将对象进行分类使相同颜色的对象相邻,并按照1,2,...k的顺序进行排序. 在线测试本题 http://www.lintcode.com/zh-cn/problem/sort-colors-ii/ 解答 这道题有两种方法. 方法一: 可以借助一个O(k)的数组bucket,然后扫一遍原来的数组,统计每一种颜色有多少个存放在数组

九章算法面试题 69 排颜色 sort colors

九章算法官网-原文网址 http://www.jiuzhang.com/problem/70/ 题目 给一个数组,并且数组里面元素的值只可能是0,1,2,然后现在把这个数组排序. 在线测试本题 http://www.lintcode.com/en/problem/sort-colors/ 解答 这道题one pass的方法需要用two pointer的技巧. 用两个指针,一个指针x指向数组头便是0和1的区分的位置, 另一个指针y指向尾表示1和2的区分的位置,然后我们在遍历一遍数组,如果当前遇到的

九章算法面试题69 排颜色 sort colors

九章算法官网-原文网址 http://www.jiuzhang.com/problem/70/ 题目 给一个数组,并且数组里面元素的值只可能是0,1,2,然后现在把这个数组排序. 在线测试本题 http://www.lintcode.com/en/problem/sort-colors/ 解答 这道题one pass的方法需要用two pointer的技巧. 用两个指针,一个指针x指向数组头便是0和1的区分的位置, 另一个指针y指向尾表示1和2的区分的位置,然后我们在遍历一遍数组,如果当前遇到的

android资源:颜色、数组、尺寸简单案例

一.颜色 1.在values\color.xml中定义 <?xml version="1.0" encoding="utf-8"?> <resources> <!-- 白色 --> <color name="white">#FFFFFF</color> <!-- 象牙色 --> <color name="ivory">#FFFFF0</c

最大子数组(LintCode)

最大子数组 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 样例 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6 注意 子数组最少包含一个数 挑战 要求时间复杂度为O(n) 若当前和小于0,那么加到下一个数上必然会使和减小,此时抛弃这个和重新求和.当遇到一个负数时,记录下当前已知的最大和. 总耗时: 2721 ms 1 public class Solution { 2 /** 3 * @param nums: A li