力扣——颜色分类

题目链接:

链接

题目描述:

力扣——颜色分类_第1张图片

思路:

思路一

类似于冒泡排序,遍历一次nums,把0都放在前面,然后再遍历一次,把1放在0后面,剩下的就都是

思路二

上面用一个指针遍历了两次,可以用两个指针只遍历一次

令P0之前的都为0,P1之前的都为1

  1. 刚开始P0和P1就在索引0处,遍历一次nums
  2. 遇到0,和P0交换,遇到1,和P1交换,然后指针前移
  3. 如果 p0 < p1,说明在P0和P1中间有个1,在交换 0 的过程中,将一个 1 交换到了前面,而现在又把0交换到了前面,这个0就占用了1的位置,此时这个1放在了后面,所以需要将这个 1 再交换到 p1 的位置。然后P0++,P1++

思路三

同样用两个指针只遍历一次

令P0之前的都为0,P2之前的都为2

  1. 刚开始P0在索引0处,P2在索引n-1处,遍历一次nums
  2. 遇到0,和P0交换,遇到2,和P2交换,P0前移,P2后移,
  3. 遇到2,和nums[P2]交换,如果nums[P2]也等于2,就会把一个2放在前面,而且不会再遍历到(i一直++,这里已经经过这个位置了,所以不会再遍历到),所以需要循环直到nums[i] != 2
  4. 如果i>P2,就不需要再遍历了

实现代码:

class Solution {
    public void sortColors(int[] nums) {
        int n = nums.length;
        int p = 0;
        //遍历找到0,移动
        for(int i = 0; i < n; i++){
            if(nums[i] == 0){
                int tmp = nums[i];
                nums[i] = nums[p];
                nums[p] = tmp;
                p++;
            }
        }
        //遍历找到1,移动
        for(int i = p; i < n; i++){
            if(nums[i] == 1){
                int tmp = nums[i];
                nums[i] = nums[p];
                nums[p] = tmp;
                p++;
            }
        }
    }
}
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] == 0){
                int tmp = nums[i];
                nums[i] = nums[p0];
                nums[p0] = tmp;
                if(p0 < p1){
                    tmp = nums[i];
                    nums[i] = nums[p1];
                    nums[p1] = tmp;
                }
                p0++;
                p1++;
            }else if(nums[i] ==1){
                int tmp = nums[i];
                nums[i] = nums[p1];
                nums[p1] = tmp;
                p1++;
            }
        }
    }
}
class Solution {
    public void sortColors(int[] nums) {
        int n = nums.length;
        int p0 = 0, p2 = n-1;
        for(int i = 0; i < n; i++){
            if(nums[i] == 0){
                int tmp = nums[i];
                nums[i] = nums[p0];
                nums[p0] = tmp;
            }
            while(nums[i] == 2 && i <= p2){
                int tmp = nums[i];
                nums[i] = nums[p2];
                nums[p2] = tmp;
                p2--;
            }
        }
    }
}

你可能感兴趣的:(力扣,leetcode,算法,职场和发展)