链接:
https://leetcode.com/problems/sort-colors/
大意:
给定一个数组nums,其内元素由0,1,2组成。对数组排序,要求按0,1,2的顺序排序。不准使用额外空间,即空间复杂度为O(1)。并且只准遍历一次数组。例子:
思路:
记录两个变量,first1以及first2。分别表示已排序数组中第一个1以及第一个2所在的位置(知道第一个2也就知道了最后一个1的位置)。
若当前遍历到的元素值为0,则令nums[first1] = 0;nums[first2] = 1;nums[i] = 2;first1++;first2++;
若当前遍历到的元素值为1,则令nums[first2] = 1;nums[i] = 2;first2++;
若当前遍历到元素值为2,则不进行元素移动。
当然,以上情况是在first1和first2都确定了的情况。另外得讨论若当前元素为第一个0,第一个1或者第一个2的情况。
详情请看如下代码。
代码:
class Solution {
public void sortColors(int[] nums) {
if (nums.length <= 1)
return ;
int first1 = -1, first2 = -1; // first1:已排序部分数组中首个1的位置
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 0) { // 当前元素为0的情况
if (first1 == -1 && first2 == -1) // 之前出现的数字全为0的情况
continue ;
else if (first1 == -1) { // 表明1还未出现过
nums[first2++] = 0;
nums[i] = 2;
} else if (first2 == -1) { // 表明2还未出现过
nums[first1++] = 0;
nums[i] = 1;
} else { // 表明1和2都已经出现过
nums[first1++] = 0;
nums[first2++] = 1;
nums[i] = 2;
}
} else if (nums[i] == 1) {
if (first2 == -1) { //还未出现过2的情况
if (first1 == -1) // 还未出现过1
first1 = i;
} else if (first1 == -1) { // 出现过2但未出现过1的情况
nums[first2] = 1;
nums[i] = 2;
first1 = first2++;
} else { // 1和2都出现过的情况
nums[first2++] = 1;
nums[i] = 2;
}
} else if (first2 == -1) { // 2之前未出现过
first2 = i;
}
}
}
}
结果:
结论:
这题主要就是一个逻辑。逻辑清楚了,跟着逻辑写代码即可。