leetcode_75_Sort Colors

来源:互联网 发布:淘宝跨境电商平台 编辑:程序博客网 时间:2024/06/01 07:50

欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢微笑


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 7class 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,2class 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的bugclass Solution {public:    void sortColors(int A[], int n) {        sort(A,A+n);    }};


1 0
原创粉丝点击