题目:

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.

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.

click to show follow up.

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 an one-pass algorithm using only constant space?

代码:

class Solution {
public:
void sortColors(vector<int>& nums) {
int p0 = ;
int p2 = nums.size()-;
int i = ;
while ( i<=p2 )
{
if ( nums[i]== )
{
std::swap(nums[i++], nums[p0++]);
continue;
}
if ( nums[i]== )
{
std::swap(nums[i],nums[p2--]);
continue;
}
i++;
}
}
};

tips:

双指针技巧。

需要注意的是指针i什么时候移动。

1) 如果发现nums[i]==0,则swap之后i后移,p0后移。

2) 如果发现nums[i]==2,则swap之后i不动,p2前移。

3) 终止条件是i>p2

要保证指针i始终处于p0和p2之间:

因为1)的交换后,肯定保证nums[i]==1。

但是2)的交换后,不一定保证nums[i]是什么,因此i暂时不动。

但是,既然1)交换后肯定保证nums[i]==1,可不可以不直接nums[i++],而是把移动i的任务交给最后的i++呢?

这样做的不太方便的,因为如果首个元素就是0,就会导致i<p0了,所以最好这样写。

=============================================

第二次过这道题,核心在于记住“因为1)的交换后,肯定保证nums[i]==1。”

class Solution {
public:
void sortColors(vector<int>& nums) {
int zero = ;
int two = nums.size()-;
int i = ;
while ( i<=two )
{
if ( nums[i]== )
{
swap(nums[i++], nums[zero++]);
}
else if ( nums[i]== )
{
swap(nums[i], nums[two--]);
}
else
{
i++;
}
}
}
};

【Sort Colors】cpp的更多相关文章

  1. leetcode 【 Sort Colors 】python 实现

    题目: Given an array with n objects colored red, white or blue, sort them so that objects of the same ...

  2. 【Sort List】cpp

    题目: Sort a linked list in O(n log n) time using constant space complexity. 代码: /** * Definition for ...

  3. hdu 4739【位运算】.cpp

    题意: 给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形.. 问最多可以拿走多少个正方形.. 思路: 先找出可以组成正方形的地雷组合cnt个.. 然后 ...

  4. 【Subsets II】cpp

    题目: Given a collection of integers that might contain duplicates, nums, return all possible subsets. ...

  5. Hdu 4734 【数位DP】.cpp

    题意: 我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字. 题目给出a,b,求出0~ ...

  6. POJ 1018 【枚举+剪枝】.cpp

    题意: 给出n个工厂的产品参数带宽b和价格p,在这n个工厂里分别选1件产品共n件,使B/P最小,其中B表示n件产品中最小的b值,P表示n件产品p值的和. 输入 iCase n 表示iCase个样例n个 ...

  7. 【Merge Intervals】cpp

    题目: Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6], ...

  8. 【Interleaving String】cpp

    题目: Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given: ...

  9. 【Combination Sum 】cpp

    题目: Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C  ...

随机推荐

  1. 华为OJ-合唱队

    华为OJ-初级题-合唱队 思路与分析 本题可以用DP的方法,分别从正向和逆向的两个方向求,该数组即186 186 150 200 160 130 197 200的上升对大序列.正向为[1, 1, 1, ...

  2. 解决Linux中遇到No such device

    虚拟机备份转移后,网络启动异常,提示“SIOCSIFADDR: No such device” he problem lies in the fact that ethernet MAC addres ...

  3. js生成有缩进的表格

    项目中用到用了两天时间想到的,记录下来,如有更好的方法,留言给我,谢谢! js做如下表格: json [{"id":302,"serviceId":15,&qu ...

  4. PHP mysql 事务处理实例

    事务是必须满足4个条件(ACID):原子性(Autmic).一致性(Consistency).隔离性(Isolation).持久性(Durability) 原子性(Autmic):事务在执行性,要做到 ...

  5. Lua 多维表的遍历中的赋值

    说到Lua的遍历将要使用到循环:先说遍历再说循环: 遇到这样类似结构的一个table Data={ []={p1=,pa={,,}}, []={p1=,pa={,,}}, []={p1=,pa={,, ...

  6. css 串联选择器和后代选择器

    串联选择器:作用在同一个标签上 <div class=”a” id ="qq"><span>look at the color</span>&l ...

  7. linux下的mount命令的用法详解

    挂接命令(mount) 首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的. 命令格式:mount [-t vfstype] [-o option ...

  8. ios 工程图片清理shell

    #!/bin/shecho "随意删除@2x图片可能会引起错误 因为ios工程会更加前缀和分辨率自己找到@2x的图片 所以删除@2x图片时要慎重"read -n1 -p  &quo ...

  9. WPF DragDrop事件元素跟随

    前一段时间项目里面要实现一个鼠标拖动一个元素到另外一个元素上面并且赋值的功能,由于要在surface上运行,拖动的时候手指会挡住系统默认的拖动图标,导致用户意识不到自己是不是在拖动着东西,所以要解决这 ...

  10. cygwin

    setup-x86_64 -q -P wget,tar,qawk,bzip2,subversion,vim wget rawgit.com/transcode-open/apt-cyg/master/ ...