leetcode:Sort Colors

一、     题目

      给一个数组包含n个物体,有蓝色、红色和白色三种颜色,把他们分类并按照红、白、蓝的顺序排列,我们用0、1、2来表示红白蓝的颜色

注解:很容易想到遍历两遍数组得到三个数的数目,再覆盖,但是请只遍历一遍数组来解决。

二、     分析

      很简单,题目的意思其实就是让对一个数组排序,数组中的元素只有0、1、2,并且要求只能遍历一遍数组,常数空间复杂度。此时我们可以想到借助于快速排序的partition思想,以1为中间枢纽对数组进行划分,使0在数组的左边,2在数组的右边,1在数组的中间。   


class Solution {
public:
    void sortColors(int A[], int n) {
        int end = -1;
		int start = n;
		int i=0;
		//end是放0那部分的尾部索引,start是放2那部分的首部索引
        //碰到0放到end+1处,碰到2放到start-1处,碰到1指针直接后移
		while(i<start){
		  if(A[i] == 0 && i!=++end)
			 swap(A[end],A[i]);
		  else if(A[i] == 2 && i!= --start) 
			 swap(A[start],A[i]);
		  else
			 i++;
		}
    }
};

    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值