75. 分类颜色

我们直接按难度最高的要求做:你能想出一个仅使用常数空间的一趟扫描算法吗?

  1. 常数空间
  2. 只能扫描一趟。注意,是一趟,而不是O(n)

题中只会出现3个数字:0,1,2。换句话说,0肯定在最前面,2肯定都在后面,1都在中间

思路大概这样:

我们用双指针法,i从前往后扫,当num[i]!=0时,j从后往前扫,直到找到第一个非2的数。然后我们就需要分情况讨论了

当num[i]2 && num[j]0时,两数可以直接交换,i++然后继续

当num[i]1 && num[j]0时,两数交换,然后此时i继续往前扫,找下一个非0的数。找到后还要分情况讨论,找到的如果是2,那太好了,就可以把num[j]上的1替换掉了。

当num[i]2 && num[j]1时,balabala

。。。

总之,双指针法,如果找到了0或者2,那么其位置可以立即确定,直接替换到前面或者后面,替换的过程中呢,中间的1也就逐渐的确定位置了,当i>=j时,排序完成。整个算法只扫了一次数组,且只用的少量的空间

class Solution {
public void sortColors(int[] nums) {
int i = 0;
int j = nums.length - 1;
while (i < j) {
while (i < j && nums[i] == 0) i++;
if (i >= j) break;
if (nums[i] == 1) {
int k = i + 1;
while (k < j && nums[k] == 1) {
k++;
}
if (nums[k] == 0) {
nums[i] = 0;
nums[k] = 1;
i++;
} else if (k < j && nums[k] == 2) {
while (j > k && nums[j] == 2) {
j--;
}
if (nums[j] == 0) {
nums[j] = 2;
nums[i] = 0;
nums[k] = 1;
i++;
} else if (nums[j] == 1) {
nums[j] = 2;
nums[k] = 1;
}
} else break;
} else if (nums[i] == 2) {
while (j > i && nums[j] == 2) {
j--;
}
if (nums[j] == 0) {
nums[i] = 0;
nums[j] = 2;
i++;
} else if (nums[j] == 1) {
nums[i] = 1;
nums[j] = 2;
}
}
}
}
}

最新文章

  1. Noi2011 阿狸的打字机
  2. linux 驱动学习笔记05--文件系统与设备文件系统
  3. 【网络编程】TCP/IP、UDP、网络概…
  4. [转]WampServer localhost 图标不显示解决办法
  5. Java 集合与队列的插入、删除在并发下的性能比较
  6. 小记:获取post和get请求。
  7. php 文件file常用的操作
  8. IOS-多视图控制器之间的切换
  9. PowerDesinger逆向数据库物理模型及关系图
  10. php功能---删除空目录
  11. sql server 性能调优之 资源等待内存瓶颈的三种等待类型
  12. C#跨进程读取listview控件中的数据
  13. 通过Python计算一个文件夹大小
  14. 20175317 《Java程序设计》第二周学习总结
  15. Tomcat性能调优后, 启动出现警告问题 [did not find a matching property.]
  16. JavaScript在IE和Firefox的不兼容问题解决方法总结
  17. 2018.11.05 NOIP模拟 列队(差分约束)
  18. C++之静态的变量和静态函数
  19. C++类模板 template &lt;class T&gt;
  20. 富文本存储型XSS的模糊测试之道

热门文章

  1. mongodb数据修复宝典
  2. SpringCloud(五)GateWay网关
  3. 支持rotate和大小限制的golang log库
  4. Ubuntu20.04安装Redis
  5. chrom里面的performance 颜色
  6. 【接口参数解析BUG】SpringMVC接口参数解析
  7. Linux下用SUID提权
  8. Windows Pe 第三章 PE头文件(上)
  9. Python练习1-文档格式化成html
  10. 『政善治』Postman工具 — 4、HTTP请求基础组成部分介绍