解决需要一次线性扫描,使得数组中的三类元素排好序的问题。华为一面
题目
leetcode 75 https://leetcode.cn/problems/sort-colors/
一、分析
思路:用三个指针
i j k
来维护这段区间,保证满足的性质:[0,j-1]
为0,[j, i-1]
为1,[k+1, n-1]
为2,一开始当i j
为0,k为n-1时,该性质满足,用i
来遍历整个数组,i
分为三种情况:a[i]为0,根据前面提到的维护性质有a[j]一定为1,此时需要交换a[i]和a[j],交换后a[j]变成了0,所以此时需要将j向前移动,再继续扫描,所以将i+1;如果a[i]为2,要知道性质是[k+1,n-1]
才为2的,所以此时需要交换a[k]和a[i],并且交换后a[k]变成了2,所以要将k--,但是,对于交换后的a[i],无法判断a[i]此时是0还是1还是2,所以i不会移动,继续判断a[i]的值;最后,如果a[i]等于1,本来要满足的性质就是[j, i - 1]
为1,所以此时将i向前移动,让a[i - 1]变成新的1.
二、代码
class Solution {
public static void swap(int[] nums, int l, int r) {
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
}
public void sortColors(int[] nums) {
for(int i = 0, j = 0, k = nums.length - 1; i <= k; ){
if(nums[i] == 0) swap(nums, i++, j++);
else if(nums[i] == 2) swap(nums, i, k--);
else i++;
}
}
}