题目

颜色分类 - 图1

解题思路

本题是经典的【荷兰国旗问题】,最好使用双指针法解决。

已知0,1,2分别表示红、白、蓝。我们设一个指针P0专门用来交换0,P1专门用来交换1。

初始的时候,两个指针都从数组头开始。

遍历过程,如果遇到1,那么和P1指针位置的数交换,并将P1右移;同理,遇到0就和P0指针位置的数交换,但是我们需要注意如果P0<P1,我们已经将一些1换到了头部位置,这个时候会把1换到末尾去(可以打断点走一遍流程),所以我们需要判断如果P0<P1,我们交换完0后,需要把交换出去的那个1交换回来。

颜色分类 - 图2

代码

  1. class Solution {
  2. public void sortColors(int[] nums) {
  3. int n = nums.length;
  4. int p0 = 0, p1 = 0;
  5. for (int i = 0; i < n; ++i) {
  6. if (nums[i] == 1) {
  7. int temp = nums[i];
  8. nums[i] = nums[p1];
  9. nums[p1] = temp;
  10. ++p1;
  11. } else if (nums[i] == 0) {
  12. int temp = nums[i];
  13. nums[i] = nums[p0];
  14. nums[p0] = temp;
  15. if (p0 < p1) {
  16. temp = nums[i];
  17. nums[i] = nums[p1];
  18. nums[p1] = temp;
  19. }
  20. ++p0;
  21. ++p1;
  22. }
  23. }
  24. }
  25. }