Leetcode75颜色分类

    科技2024-06-10  71

    我的力扣主页

    题目链接

    这道题一看就是一道双指针的问题,可惜我想到了双指针没想到怎么做,看了官方的动图明白了怎么做这道题,动图可以看下官方题解里的动图,里面放不了官方题解建议看一遍动图,代码就很好写出来了

    代码如下,和官方实现的略有不同,想法是一样的,毕竟我是看着官方动图写出来,讲解一下我对这道题的思路:有两个变量,一个指向下一个存0的地方(p0),一个指向下一个存1的地方(p1)。当nums[i] == 0的时候就要把该0移到p0的位置上,并且p0要往后挪一位。其次还要注意一点的是,如果p0和p1指向的位置相同,p1也要挪的哦,因为这个地方已经给了0不可能在给1了,所以p1也要挪一位。

    下面的if只能写成if不可以写成else if,为什么捏?因为你挪0的时候有可能是0和1就行交换的,你else if就无法判断是不是0和1交换的了,如果强行else if在nums[i] ==0里加条件,这不仅是代码变多了,逻辑上我个人感觉也更难理解了

    class Solution { public: void sortColors(vector<int>& nums) { int p0 = 0 , p1 = 0; for(int i = 0;i < nums.size();++i){ if(nums[i] == 0){ //p0和p1下标相同的时候p1的下标也要加1 if(p0 == p1){ ++p1; } swap(nums[i],nums[p0]); ++p0; } if(nums[i] == 1){//这里一定要用if,因为可能1和0进行了交换 swap(nums[p1],nums[i]); ++p1; } } } };
    Processed: 0.010, SQL: 8