LeetCode-75 颜色分类
题目链接:LeetCode-75
题目大意:数组中包含0,1,2三种数字 将数组排序 不能用Arrays.sort()排序进行
解题思路:普通的排序就可以解决 但是这样做就浪费了这道题 我的思路是使用两个坐标left 和right 意义是当前处理的坐标 和处理完的“2”序列最前面的坐标 left从0开始 遇到1就保持现状不变并把left向右移动一位(保证了0在最前面) 遇到2就将left和right-1位置上的数字换一下 (保证了2在最后面)这样就有一个问题 1如何处理 我们可以将1全部变为0 并将1出现的次数记录下来 因为循环结束的条件是两个坐标指向同一个区域 而这个区域恰好是排好的2的第一位 所以前面的一定就会是1 最后我们将改掉的0再改回1即可
我不是很清楚这样的作法算不算仅使用常数空间的一趟扫描算法
另外看LeetCode的解题这道题还有新的知识点没有挖掘
代码块:
class Solution {
public void sortColors(int[] nums) {
int left = 0, right = nums.length;
int sum1 = 0;
while(left!=right){
if(nums[left] == 0){
left++;
continue;
}
if(nums[left] == 1){
nums[left] = 0;
sum1++;
left++;
continue;
}
if(nums[left] == 2){
//如果是2 则与右指针的数字替换 右指针始终指向排好的2的最前一位
int t = nums[left];
nums[left] = nums[right-1];
nums[right-1] = t;
right--;
}
}
while(sum1 != 0){
nums[--right] = 1;
sum1--;
}
}
}