【题目连接】

75.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.

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?

【分析】

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.

这是我们首先会想到的。可是题目要求我们不能这样。

【代码】

    /**------------------------------------*   日期:2015-02-02*   作者:SJF0115*   题目: 75.Sort Colors*   网址:https://oj.leetcode.com/problems/sort-colors/*   结果:AC*   来源:LeetCode*   博客:---------------------------------------**/#include <iostream>#include <vector>#include <algorithm>using namespace std;class Solution {public:void sortColors(int A[], int n) {if(n <= 1){return;}//if// 统计个数int red = 0,white = 0,blue = 0;for(int i = 0;i < n;++i){if(A[i] == 0){++red;}//ifelse if(A[i] == 1){++white;}//elseelse{++blue;}//else}//for// 重新布局for(int i = 0;i < n;++i){if(red > 0){A[i] = 0;--red;}//ifelse if(white > 0){A[i] = 1;--white;}//elseelse{A[i] = 2;}}//for}};int main(){Solution s;int A[] = {0,0,1,0,2,0,1,2};s.sortColors(A,8);for(int i = 0;i < 8;++i){cout<<A[i]<<endl;}//for// 输出return 0;}

【思路二】

用三个变量记录red,white,blue的下标位置。起始下标都为-1

如果A[i] == 0 ,插入red对white blue有影响,blue先整体向后移动一位,white再整体向后移动一位,如果不移动,前面插入的数据就会覆盖已有的。

如果A[i] == 1,插入white对blue有影响,blue整体向后移动一位。

A[i] == 2,直接插入blue

【代码二】

    /**------------------------------------*   日期:2015-02-03*   作者:SJF0115*   题目: 75.Sort Colors*   网址:https://oj.leetcode.com/problems/sort-colors/*   结果:AC*   来源:LeetCode*   博客:---------------------------------------**/#include <iostream>#include <vector>#include <algorithm>using namespace std;class Solution {public:void sortColors(int A[], int n) {if(n <= 1){return;}//ifint red = -1,white = -1,blue = -1;for(int i = 0;i < n;++i){// 插入red对white blue有影响if(A[i] == 0){// blue整体向后移动一位A[++blue] = 2;// white整体向后移动一位A[++white] = 1;// 插入redA[++red] = 0;}//if// 插入white blue受到影响else if(A[i] == 1){// blue整体向后移动一位A[++blue] = 2;// 插入whiteA[++white] = 1;}//else// 插入blue对其他没有影响else{// 插入blueA[++blue] = 2;}//else}//for}};int main(){Solution s;int A[] = {0,0,1,0,2,0,1,2};s.sortColors(A,8);for(int i = 0;i < 8;++i){cout<<A[i]<<endl;}//for// 输出return 0;}

【思路三】

冒泡排序
class Solution {
public:void sortColors(int A[], int n) {for(int i=0;i<n;i++){for(int j=0;j<n-i-1;j++){if(A[j]>A[j+1]){int tmp=A[j];A[j]=A[j+1];A[j+1]=tmp;}}}}
};

【思路四】

我们可以把数组分成三部分,前部(全部是0),中部(全部是1)和后部(全部是2)三个部分,每一个元素(红白蓝分别对应0、1、2)必属于其中之一。

将前部和后部各排在数组的前边和后边,中部自然就排好了。

设置两个指针begin指向前部的末尾的下一个元素(刚开始默认前部无0,所以指向第一个位置),end指向后部开头的前一个位置(刚开始默认后部无2,所以指向最后一个位置),然后设置一个遍历指针current,从头开始进行遍历。

(1)若遍历到的位置为1,则说明它一定属于中部,根据总思路,中部的我们都不动,然后current向前移动一个位置。

(2)若遍历到的位置为0,则说明它一定属于前部,于是就和begin位置进行交换,然后current向前移动一个位置,begin也向前移动一个位置(表示前边的已经都排好了)。

(3)若遍历到的位置为2,则说明它一定属于后部,于是就和end位置进行交换,由于交换完毕后current指向的可能是属于前部的,若此时current前进则会导致该位置不能被交换到前部,所以此时current不前进。而同1),end向前移动一个位置。

【代码四】

    /**------------------------------------*   日期:2015-02-04*   作者:SJF0115*   题目: 75.Sort Colors*   网址:https://oj.leetcode.com/problems/sort-colors/*   结果:AC*   来源:LeetCode*   博客:---------------------------------------**/class Solution {public:void sortColors(int A[], int n) {int begin = 0,end = n-1,cur = 0;while(cur <= end){if(A[cur] == 0){swap(A[begin],A[cur]);// 指向排序0末尾的下一个位置++begin;// 向前遍历++cur;}//ifelse if(A[cur] == 1){++cur;}//elseelse{swap(A[end],A[cur]);// 指向排序2开头的前一个位置--end;}//else}//for}};

详细参考:[算法系列之十一]荷兰国旗问题

[LeetCode]75.Sort Colors相关推荐

  1. LeetCode 75. Sort Colors (python一次遍历,模拟三路快排)

    LeetCode 75. Sort Colors (python一次遍历,模拟三路快排) 题目分析: 本题需要实现数字只包含0,1,2的排序,并且要求一次遍历. 由于只用把数字隔离开,很容易想到快排的 ...

  2. 【排序】LeetCode 75. Sort Colors

    LeetCode 75. Sort Colors Solution1: 参考自:<leetcode-cpp 答案> 由于0,1,2非常紧凑,首先想到计数排序(counting sort), ...

  3. LeetCode 75 Sort Colors(颜色排序)

    翻译 给定一个包括红色.白色.蓝色这三个颜色对象的数组.对它们进行排序以使同样的颜色变成相邻的,其顺序是红色.白色.蓝色.在这里,我们将使用数字0.1和2分别来代表红色.白色和蓝色. 原文 Given ...

  4. LeetCode 75. Sort Colors

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

  5. 个人记录-LeetCode 75. Sort Colors

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

  6. leetcode 75. Sort Colors | 75. 颜色分类(荷兰国旗问题,快速排序)

    题目 https://leetcode.com/problems/sort-colors/ 题解 快速排序3.0(随机快排+荷兰国旗技巧优化) 在arr[L-R]范围上,进行快速排序的过程: 1)在这 ...

  7. 75. Sort Colors - LeetCode

    Question 75. Sort Colors Solution 题目大意: 给一个数组排序,这个数组只有0,1,2三个元素,要求只遍历一遍 思路: 记两个索引,lowIdx初始值为0,highId ...

  8. Leetcode 075 Sort Colors

    题目连接:Leetcode 075 Sort Colors 解题思路:从左向右遍历,同时维护两个指针r和b,0~r位置上的元素为0,b~n-1位置上的为2.在遍历过程中,碰到0,放到r的位置:碰到2, ...

  9. LeetCode 75. Sort Colors--Python解法

    题目地址:Sort Colors - LeetCode Given an array with n objects colored red, white or blue, sort them in-p ...

最新文章

  1. USACO 1.0_Greedy Gift Givers
  2. 在docker中使用MySQL数据库
  3. AMS重要的数据结构解析(一):ActivityRecord
  4. virtualbox奇葩的问题-unable to load r3 module
  5. 多分类loss函数本质理解
  6. Linux下Cpabe Toolkit安装教程
  7. springboot-custom starter
  8. 【大会】QoE也能驱动业务创新
  9. 以太坊钱包开发系列4 - 发送Token(代币)
  10. CISC与RISC的区别?
  11. wemall app商城源码Android之支付宝通知处理类
  12. java jlist删除选中的项_java jlist removeListSelectionListener 怎样删除已经建好的 ListSelectionListener...
  13. C/C++编程语言中指针(pointer)介绍
  14. oracle 游标取字段名称,Oracle使用游标查询指定数据表的所有字段名称组合而成的字符串...
  15. JavaSE基础——Java多线程(2)
  16. php公众号客服系统,公众号客服系统完全攻略
  17. android模拟拍照,Android调用系统相机拍照,并且模仿实现水印相机简单功能
  18. 正则替换非中英文数字 js C#
  19. ajax多个分页,通过Ajax与kaminari进行多重分页
  20. Navicat中出现MySQL server has gone away错误

热门文章

  1. 发票识别+发票查验API
  2. 【2016 泉市教科】保险箱
  3. strncpy 用法注意
  4. 微信H5公众号支付问题-(get_brand_wcpay_request:fail)2017年10月
  5. 马云香港演讲年轻人创业
  6. 微型计算机原理综合实验报告,微机原理综合实验报告[精心整理].doc
  7. PCB中的常见名词解析solder Mask 和paste Mask
  8. Android开发教程--第一个JNI程序
  9. io类游戏快速开发 1
  10. VScode输入 !无法自动生成html模板问题