排序-荷兰国旗问题

解决需要一次线性扫描,使得数组中的三类元素排好序的问题。华为一面


题目

排序-荷兰国旗问题

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++;
        }
    }
}

版权声明:如无特殊标注,文章均来自网络,本站编辑整理,转载时请以链接形式注明文章出处,请自行分辨。

本文链接:https://www.shbk5.com/dnsj/74919.html