题意:
解题思路:
思路:1.最后的结果是所有的0在前, 所有的2在后, 1.1 首先从前后向扫描0, 把所有0swap到头部,然后缩小范围,l++; 1.2 然后从前向后扫描2, 把所有2swap到尾部,确定2是最后一个后,缩小范围,r--;
PHP代码实现:
class Solution { /** * @param Integer[] $nums * @return NULL */ function sortColors(&$nums) { return $this->sortThreeColorsCount($nums); $left = 0; $right = count($nums) - 1; for ($i = 0; $i <= $right; $i++) { if ($nums[$i] == 0) { $this->swap($nums, $i, $left); $left++; } elseif ($nums[$i] == 2) { $this->swap($nums, $i, $right); $right--; $i--; } } } function swap(&$nums, $i, $j) { $temp = $nums[$i]; $nums[$i] = $nums[$j]; $nums[$j] = $temp; } function sortThreeColorsCount(&$nums) { if ($nums == null || count($nums) == 0) return; $cnt0 = $cnt1 = $cnt2 = 0; foreach($nums as $num) { if ($num == 0) ++$cnt0; else if ($num == 1) ++$cnt1; else ++$cnt2; } $k = 0; for ($i = 0; $i < $cnt0; ++$i) $nums[$k++] = 0; for ($i = 0; $i < $cnt1; ++$i) $nums[$k++] = 1; for ($i = 0; $i < $cnt2; ++$i) $nums[$k++] = 2; }}
GO代码实现:
func sortColors(nums []int) { l, r := 0, len(nums)-1 for i := 0; i <= r; i++ { if nums[i] == 0 { swap(nums, i, l) l++ } else if nums[i] == 2 { swap(nums, i, r) // i-- ?因为有可能挪过来的数据还是2, //所以需要重新检查(下一次)i 的数据 i-- r-- } }}func swap(nums []int, i,j int){ nums[i], nums[j] = nums[j], nums[i]}