码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode_75_Sort Colors

时间:2015-02-11 18:41:01      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢技术分享


Sort Colors 
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.


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?




方法一:解题思路
e0代表endOfZero; e1代表endOfOne;curId代表当前遍历的值
从后往前遍历,循环一遍
当A[curId]=1,交换A[curId]和A[e0],即将1都交换到最后一个0的位置。成功后e0--,最后一个0的位置向前移了一位
当A[curId]=2,交换A[curId]和A[e0],再交换A[e1]和A[e0],即将2都交换到最后一个0的位置,再将2交换到最后一个1的位置。成功后e0--和e1--,最后一个0和1的位置向前移了一位


//vs2012测试代码
#include<iostream>

using namespace std;

#define N 7

class Solution {
public:
    void sortColors(int A[], int n) 
	{
        int e0=n-1 , e1=n-1;
		for(int curId=n-1; curId>=0; curId--)
		{
			if( A[curId] == 1)
			{
				swap( A[curId],A[e0] );
				e0--;
			}
			if( A[curId] == 2)
			{
				swap( A[curId],A[e0] );
				swap( A[e0],A[e1] );
				e0--;
				e1--;
			}
		}
		for(int i=0; i<n; i++)
			cout<<A[i];
    }
};

int main()
{
	int A[N]={0,1,2,1,1,0,2};
	Solution lin;
	lin.sortColors( A,N );

	return 0;
}

//方法一:自测Accepted
//reverse travel the array 
//e0代表endOfZero; e1代表endOfOne
//从后往前遍历,循环一遍
//当A[curId]=1,交换A[curId]和A[e0],即将1都交换到最后一个0的位置。成功后e0--,最后一个0的位置向前移了一位
//当A[curId]=2,交换A[curId]和A[e0],再交换A[e1]和A[e0],即将2都交换到最后一个0的位置,再将2交换到最后一个1的位置。成功后e0--和e1--,最后一个0和1的位置向前移了一位

class Solution {
public:
    void sortColors(int A[], int n) 
	{
        int e0=n-1 , e1=n-1;
		for(int curId=n-1; curId>=0; curId--)
		{
			if( A[curId] == 1)
			{
				swap( A[curId],A[e0] );
				e0--;
			}
			if( A[curId] == 2)
			{
				swap( A[curId],A[e0] );
				swap( A[e0],A[e1] );
				e0--;
				e1--;
			}
		}
		for(int i=0; i<n; i++)
			cout<<A[i];
    }
};

//方法二:记录各自次数,在原数组重新赋值0,1,2
class Solution {
public:
    void sortColors(int A[], int n) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        int r = 0, w = 0, b = 0;
        for (int i = 0; i < n; i++) {
            r += A[i] == 0;
            w += A[i] == 1;
            b += A[i] == 2;
        }
        for (int i = 0; i < n; i++) {
            A[i] = i < r ? 0 : i < r + w ? 1 : 2;
        }        
    }
};

//方法三:这都能通过,应该是OJ的bug
class Solution {
public:
    void sortColors(int A[], int n) 
	{
        sort(A,A+n);
    }
};


leetcode_75_Sort Colors

标签:

原文地址:http://blog.csdn.net/keyyuanxin/article/details/43735837

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!