75. Sort Colors

问题描述:

给一个包含n个数字的数组,其中有0,1,2;排序使得所有相同的数字相邻,且按照0,1,2的顺序。

思路:

(1)计数排序:

  需要扫两遍数组,一遍统计个数,第二遍开始摆放数字。

代码如下:

 void sortColors(vector<int>& nums) {
int i=,j=,k=;
int n=nums.size();
for(int p=;p<n;p++)
{
if(nums[p]==)
i++;
else if(nums[p]==)
j++;
else
k++;
}
for(int p=;p<n;p++)
{
if(p<i)
nums[p]=;
else if(p>=i&& p<i+j)
nums[p]=;
else
nums[p]=;
}
}

(2)如果只能扫一遍,很容易想到的就是左边存放0和1,右边存放2.两边往中间靠。

设置两个index,left记录第一个1的位置,left左边为0,right记录第一个非2的位置,right右边为2.

然后使用i从头到尾扫一遍,直到与right相遇。

i遇到0就换到左边去,遇到2就换到右边去,遇到1就跳过。

需要注意的是:由于left记录第一个1的位置,因此A[left]与A[i]交换后,A[left]为0,A[i]为1,因此i++;

而right记录第一个非2的位置,可能为0或1,因此A[right]与A[i]交换后,A[right]为2,A[i]为0或1,i不能前进,要后续判断。

由此该数组分为4段:[0,left)-->0; [left,i)-->1; [i,right]-->乱序; (right,n-1]-->2

0  0  0  1  1  1  2  1  0  2  1  2  2  2

^         ^             ^

left         i            right

最直接的方法就是partition方法,代码如下:

 void sortColors(int A[], int n) {
int left = ;
int right = n-;
int i = ;
while(i <= right)
{
if(A[i] == )
{
swap(A[left], A[i]);
left ++;
i ++;
}
else if(A[i] == )
{
i ++;
}
else
{
swap(A[i], A[right]);
right --;
}
}
}

(3)最漂亮的一种做法:

【最直观:平移插入】

 void sortColors(int A[], int n) {
int i = -;
int j = -;
int k = -;
for(int p = ; p < n; p ++)
{
//根据第i个数字,挪动0~i-1串。
if(A[p] == )
{
A[++k] = ; //2往后挪
A[++j] = ; //1往后挪
A[++i] = ; //0往后挪
}
else if(A[p] == )
{
A[++k] = ;
A[++j] = ;
}
else
A[++k] = ;
} }

最新文章

  1. Programming Contest Problem Types
  2. 【转】 void与void*详解
  3. 2014 Super Training #4 E Paint the Grid Reloaded --联通块缩点+BFS
  4. tp空操作和空控制器处理
  5. Eclipse自动生成UML图(转载)
  6. Asp.net 后台添加Meta标签方法
  7. vs2013下使用Assist X的破解方法
  8. [TYVJ] P1001 第K极值
  9. Jquery如何获取控件ID
  10. window.settimeout用法与window.setInterval用法的区别
  11. 文件一键上传、汉字转拼音、excel文件上传下载功能模块的实现
  12. filebeat+logstash配置
  13. Nginx虚拟主机 子文件单独配置
  14. C语言小笔记
  15. 开源项目初涉(C++自我学习开始)
  16. Retrofit 2.0基于OKHttp更高效更快的网络框架 以及自定义转换器
  17. scala面向对象.高阶函数,柯里化,Actor编程简介
  18. Oracle NID工具修改数据库DBID、数据库名称、数据库实例名
  19. SQL 语句语法简介(一)
  20. GoogLeNet解读

热门文章

  1. Linux - mkdir -p a/b/c
  2. 201621123080《Java程序设计》第1周学习总结
  3. python入门:输出1-100之内的所有奇数和偶数
  4. 关于PHP连接池扩展php-cp遇到的那些坑
  5. 【nginx】nginx.sh nginx 安装脚本
  6. 【netbeans】netbeans utf-8编码
  7. 批量保存云盘链接的demo
  8. sqli-labs less1 &amp;&amp;less3&amp;&amp;less4学习心得
  9. 00018_流程控制语句switch
  10. Java学习笔记2---设置环境变量JAVA_HOME,CLASSPATH,PATH