leetcode_72:颜色分类

这个题目一开始并不会做,但是后来硬着头皮还是做了出来(傲娇脸!!)。咋个说呢,思路比较容易想到,就是把0放左边,2放右边,那么中间自然就是1了。我也是这样想的,我也是这样做的,哈哈。下面说一下大体思路。

  1. 首先有两个指针p0和p2,它们分别从最左端和最右端出发,而且分别始终指向第一个不为0和不为2的值。
  2. 然后在设置一个指针p从p0触发,直到小于等于p2.
  3. 如果p所指的数字为0(当然一开始不可能,因为从p0触发指向的肯定不是0),那么将它与p0处的值交换,p0向右移动直到下一个不为0的位置
  4. 如果p所指的数字为2,则将它与p2处的值交换,p2向左移动直到下一个不为2的位置
  5. 一直到p指针与p2相遇为止。

代码如下:

    public void sortColors(int[] nums) {
        int p0 = 0, p2 = nums.length - 1, p = p0;
        while (p <= p2) {
            for (;p0 < nums.length && nums[p0] == 0; ++p0);	//p0指向左边第一个不为0的元素
            p = p0; //p指针从p0出发
            for (;p2 >= 0 && nums[p2] == 2; --p2);  //指向右边第一个不为2的元素
            for (;p <= p2 && nums[p] != 2 && nums[p] != 0; ++p);    //从左到右找到第一个0或者2
            if (p <= p2 && nums[p] == 2) {	//如果找到了2,那么交换,且p2向前移动
                swap(nums, p, p2);
                p2--;
            } else if (p <= p2 && nums[p] == 0) {	//如果找到了0,那么交换,且p0向后移动
                swap(nums, p, p0);
                p0++;
            }
        }
    }

	//交换函数
    private void swap(int[] nums, int index1, int index2) {
        int temp = nums[index1];
        nums[index1] = nums[index2];
        nums[index2] = temp;
    }

下面是题目给的例子的示意图
在这里插入图片描述

发布了96 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/reachwang/article/details/103357413