Sort Colors
2015-12-07 15:46
218 查看
题目大意:给一个n个元素的数组,由0,1,2三个数组成,要求将这个数组按照从小到大的顺序排列。
直观想法:遍历一遍数组,分别统计0,1,2三个元素的个数,然后根据各个元素的个数将原来的数组进行覆盖。这种方法需要对数组进行两轮遍历,第一轮遍历统计个数,第二轮遍历覆盖原数组。
改进想法:一次遍历即可将原数组排好序。一般来说排序算法都不太会是O(n)时间复杂度的,这道题之所以能做到这一点是因为只有3个元素。方法是:从前往后遍历数组,若遍历到0则将当前遍历到的0与从前往后最先的一个非0的数进行交换,若遍历到2则将当前遍历到的2与从后往前最先的一个非2的数进行交换,若遍历到1则继续往后遍历。对于0和2的情况,需要将当前元素与前面的或者后面的元素进行交换,所以需要用2个变量分别记住一前一后两个下标的位置,并不断进行更新。代码如下:
直观想法:遍历一遍数组,分别统计0,1,2三个元素的个数,然后根据各个元素的个数将原来的数组进行覆盖。这种方法需要对数组进行两轮遍历,第一轮遍历统计个数,第二轮遍历覆盖原数组。
改进想法:一次遍历即可将原数组排好序。一般来说排序算法都不太会是O(n)时间复杂度的,这道题之所以能做到这一点是因为只有3个元素。方法是:从前往后遍历数组,若遍历到0则将当前遍历到的0与从前往后最先的一个非0的数进行交换,若遍历到2则将当前遍历到的2与从后往前最先的一个非2的数进行交换,若遍历到1则继续往后遍历。对于0和2的情况,需要将当前元素与前面的或者后面的元素进行交换,所以需要用2个变量分别记住一前一后两个下标的位置,并不断进行更新。代码如下:
void sortColors(int* nums, int numsSize) { int left=0, right=numsSize-1, zero=0, t; while(left<=right) { if(nums[left]==0) { t = nums[left]; nums[left] = nums[zero]; nums[zero] = t; zero++; left++; } else if(nums[left]==2) { t = nums[left]; nums[left] = nums[right]; nums[right] = t; right--; } else { left++; } } }需要注意的是:nums[left]==0 和 nums[left]==2两种情况的处理是不太一样的,在nums[left]==0中有left++,而在nums[left]==2中并没有left++,因为2与后面的数进行交换之后可能把后面的0换到当前位置了,因此该left位置需要在下一轮循环再判定一次,以便换过来的0能够交换到前面去。而nums[left]==0中并不需要考虑这种情况。
相关文章推荐
- Linux C函数参考手册(PDF版)
- Lua教程(十七):C API简介
- C#实现打造气泡屏幕保护效果
- 使用C#代码获取存储过程返回值
- C/C++数据对齐详细解析
- 利用C语言来求最大连续子序列乘积的方法
- 字符串的组合算法问题的C语言实现攻略
- C 语言基础教程(我的C之旅开始了)[三]
- C++中的extern “C”用法详解
- C 语言基础教程(我的C之旅开始了)[七]
- 最大子矩阵问题实例解析
- C字符串操作函数实现方法小结
- C语言中static的作用及C语言中使用静态函数有何好处
- 字典树的基本知识及使用C语言的相关实现
- 详解C语言中free()函数与getpagesize()函数的使用
- C/C++ 宏详细解析
- 使用C语言解决字符串全排列问题
- C#定制Excel界面并实现与数据库交互的方法
- C#使用ImitateLogin模拟登录百度