题意:

image.png

解题思路:

  1. 思路:
  2. 1.最后的结果是所有的0在前, 所有的2在后,
  3. 1.1 首先从前后向扫描0, 把所有0swap到头部,然后缩小范围,l++;
  4. 1.2 然后从前向后扫描2, 把所有2swap到尾部,确定2是最后一个后,缩小范围,r--;

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer[] $nums
  4. * @return NULL
  5. */
  6. function sortColors(&$nums) {
  7. return $this->sortThreeColorsCount($nums);
  8. $left = 0;
  9. $right = count($nums) - 1;
  10. for ($i = 0; $i <= $right; $i++) {
  11. if ($nums[$i] == 0) {
  12. $this->swap($nums, $i, $left);
  13. $left++;
  14. } elseif ($nums[$i] == 2) {
  15. $this->swap($nums, $i, $right);
  16. $right--;
  17. $i--;
  18. }
  19. }
  20. }
  21. function swap(&$nums, $i, $j) {
  22. $temp = $nums[$i];
  23. $nums[$i] = $nums[$j];
  24. $nums[$j] = $temp;
  25. }
  26. function sortThreeColorsCount(&$nums) {
  27. if ($nums == null || count($nums) == 0) return;
  28. $cnt0 = $cnt1 = $cnt2 = 0;
  29. foreach($nums as $num) {
  30. if ($num == 0) ++$cnt0;
  31. else if ($num == 1) ++$cnt1;
  32. else ++$cnt2;
  33. }
  34. $k = 0;
  35. for ($i = 0; $i < $cnt0; ++$i) $nums[$k++] = 0;
  36. for ($i = 0; $i < $cnt1; ++$i) $nums[$k++] = 1;
  37. for ($i = 0; $i < $cnt2; ++$i) $nums[$k++] = 2;
  38. }
  39. }

GO代码实现:

  1. func sortColors(nums []int) {
  2. l, r := 0, len(nums)-1
  3. for i := 0; i <= r; i++ {
  4. if nums[i] == 0 {
  5. swap(nums, i, l)
  6. l++
  7. } else if nums[i] == 2 {
  8. swap(nums, i, r)
  9. // i-- ?因为有可能挪过来的数据还是2,
  10. //所以需要重新检查(下一次)i 的数据
  11. i--
  12. r--
  13. }
  14. }
  15. }
  16. func swap(nums []int, i,j int){
  17. nums[i], nums[j] = nums[j], nums[i]
  18. }