LintCode: Sort Colors
2015-12-01 11:19
232 查看
通过交换,对0,1,2排序
使用三个标记[循环不变式]
i从前向后,记录最后一个0的位置
j从后向前,记录第一个2的位置
k从前向后,是遍历用的游标
[0..i-1]是0
[i..k-1]是1
[k,j-1]是未探测
[j..n-1]是2
初始k=0时,0,1,2的区域都是空,所有区域都是未探测,循环k=0..n-1
如果a[k] = 0=>swap(a[i++], a[k])
如果a[k] = 1=>无操作
如果a[k] = 2=>swap(a[--j], a[k--])
复杂度O(n)
使用三个标记[循环不变式]
i从前向后,记录最后一个0的位置
j从后向前,记录第一个2的位置
k从前向后,是遍历用的游标
[0..i-1]是0
[i..k-1]是1
[k,j-1]是未探测
[j..n-1]是2
初始k=0时,0,1,2的区域都是空,所有区域都是未探测,循环k=0..n-1
如果a[k] = 0=>swap(a[i++], a[k])
如果a[k] = 1=>无操作
如果a[k] = 2=>swap(a[--j], a[k--])
复杂度O(n)
class Solution{ public: /** * @param nums: A list of integer which is 0, 1 or 2 * @return: nothing */ void sortColors(vector<int> &nums) { // write your code here int i = 0, j = nums.size(); for (int k = 0; k < j; ++k) { if (nums[k] == 0) { swap(nums[i++], nums[k]); } else if (nums[k] == 2) { swap(nums[--j], nums[k--]); } } } };
相关文章推荐
- ⾃自定义cell的步骤
- ASP.NET能知道的东西
- android 三星手机拍照裁剪后会旋转问题
- linux防火墙
- Zookeeper入门-Java版本HelloWorld例子
- Zookeeper入门-Java版本HelloWorld例子
- Zookeeper入门-Java版本HelloWorld例子
- leetcode:Palindrome Partitioning II
- 编译 PHP 及 memcached 扩展
- Java 8 Optional类深度解析
- 每天一个linux命令(24):gzip命令
- git学习------>如何用git log命令来查看某个指定文件的提交历史记录
- Message Handler报Java.lang.NullPointerException
- 不知不觉,json数据传输与接口调用
- IOS TableViewCell嵌套webview 自适应高度
- centos7下致命错误:mysql/mysql.h:没有那个文件或目录
- eclipse项目导入as
- Volley的用法
- 最全的CSS浏览器兼容问题
- SAP问题处理总结