题目链接:75. 颜色分类 - 力扣(LeetCode)

题目解析:

题目很简单,给出一个只含有0,1,2的数组,它们分别代表不同的颜色,题目的要求是让我们在不使用库函数sort的情况下,将它排成一个有序的数组;


算法原理:

“三指针” (自创名词罢了,类似双指针用法)

所谓”三指针”就是定义三个指针,每个指针有着不同作用,随着指针的移动会将数组分为四个部分,以此来接近我们所要的结果;

板书如下:

我相信大家看了这个板书已经初步理解这个算法原理了,这时候我们只需要去遍历这个数组判断该位置的值,并做一下指针的移动即可;

板书:

解释:数组中就0,1,2三个数值,所以将数组的值分为三种情况讨论,当i位置为0时,由于我们定义的left指针指向0区域的最后一个位置,所以我们要将此时i位置的0和left后一个位置交换,这样才能保证我们left指针的正确性;当i位置为1时,我们不做处理,让i++即可,保证[left+1,i-1]全为1。当i位置为2时,由于我们的right指针指向2区域的第一个位置,所以我们将该i位置的2,要和right指针的前一个位置进行交换,但是这里就有细节我们不能给i++,由于我们的i指针是从左向右移动扫描的,[i,right-1]区间还未扫描,交换后还需要进行判断,不可直接跳过!

AC代码:

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int n = nums.size();
        int left = -1;
        int i = 0;
        int right = n;
        while (i < right) {
            if (nums[i] == 0) {
                swap(nums[i++], nums[++left]);
            } else if (nums[i] == 2) {
                swap(nums[i], nums[--right]);
            } else
                i++;
        }
    }
};

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐