LeetCode 75. 颜色分类
题目链接
题目思路
如果按照平常做法的话这个题的确非常的容易,我们先对数组中的数进行计数,然后再按个插入即可。
但是进阶要求我们使用一趟扫描并且还是常数空间的做法。
那么我们其实可以在第一次扫描数组的时候就把它放置到相应的位置了。因为数组只有0
,1
,2
三种数字,我们其实只需要留意三个中的两个即可,因为总数已经确定了,我们把其中两种安排好了,另外一种自然就会落到对应的位置上。
我们利用left
, right
来记录当前放置的0和2的位置,再利用i
来遍历数组。
如果nums[i] == 0
,那么我们就把这个数字放到nums[left]
的位置上,同时因为我们是从左到右进行扫描的,左边交换过来的数字一定是0
或者1
,所以不需要进行再次判断。
如果nums[i] == 2
,那么我们就把这个数字放到nums[right]
的位置上,但是因为我们并不知道交换回来的数字是什么,所以要再对交换回来的数字进行判断。
代码实现
class Solution {
public void sortColors(int[] nums) {
int left = 0;
int right = nums.length - 1;
for(int i = 0; i <= right; i++){
if(nums[i] == 0){
int temp = nums[i];
nums[i] = nums[left];
nums[left] = temp;
left++;
}else if(nums[i] == 2){
int temp = nums[i];
nums[i] = nums[right];
nums[right] = temp;
right--;
//为了对交换回来的数字再次判断
i--;
}
}
}
}