larscheng / algo

0 stars 0 forks source link

【Check 85】2024-05-29 - 75. 颜色分类 #193

Open larscheng opened 4 months ago

larscheng commented 4 months ago

75. 颜色分类

larscheng commented 4 months ago

思路

双指针 方法1:

方法2:

O(n)/O(1)

代码


class Solution {

    public void sortColors(int[] nums) {
        int n = nums.length;
        int p0 =0,p1=0;
        for (int i = 0; i < n; i++) {
            if (nums[i]==1){
                int temp = nums[i];
                nums[i]=nums[p1];
                nums[p1] = temp;
                ++p1;
            } else if (nums[i]==0) {
                int temp = nums[i];
                nums[i] = nums[p0];
                nums[p0] = temp;
                //把nums[i]的0与p0交换后,如果p0小于p1,说明在此前已经有1放在了p0处
                //此时需要把nums[i]与p1交换,重新把这个1放到前面
                if (p0 < p1) {
                    temp = nums[i];
                    nums[i] = nums[p1];
                    nums[p1] = temp;
                }
                ++p0;
                ++p1;
            }
        }
    }
}

class Solution {

    public void sortColors(int[] nums) {
        int n = nums.length;
        int p0 =0,p2=n-1;
        for (int i = 0; i <= p2; i++) {
            //被交换过来的元素有可能也是2
            while (i <= p2 && nums[i] == 2) {
                int temp = nums[i];
                nums[i] = nums[p2];
                nums[p2] = temp;
                --p2;
            }
            if (nums[i]==0){
                int temp = nums[i];
                nums[i]=nums[p0];
                nums[p0] = temp;
                ++p0;
            }
        }

    }
}

复杂度