代码随想录算法训练营19期第2天| 滑动窗口,螺旋矩阵模拟 (二刷)

【滑动窗口:209 长度最小子数组 904.水果成篮 76.最小覆盖子串】

209长度最小子数组

sum要达到target,自己滑动窗口法ac,不断往前囊括新的一个,然后试着从头减少一个个,看sum还够不够

mycode:

int minSubArrayLen(int target, vector& nums) {
        int minlen=200000;
        int sum=0;
        int fast=0;
        int slow=0;
               
        while(fast=target && slow<=fast){
                sum-=nums[slow];
                
                slow++;
            }
            if(sum>=target) minlen=min(minlen,fast-slow+1);
            
            fast++;
        }

        return minlen==200000?0:minlen;
        
    }

逻辑整理的更简洁:

    int minSubArrayLen(int target, vector& nums) {
        int minlen=200000;
        int sum=0;
        int fast=0;
        int slow=0;
               
        while(fast=target){
                minlen=min(minlen,fast-slow+1);
                sum-=nums[slow++];
            }
            fast++;
        }
        return minlen==200000?0:minlen;
    }

904 水果成篮 

一刷,快写出来但没写出来。数据结构unordered map选对了,我的问题出在前面的要一个一个减去,不能一下子把前面某个直接设为0,从map里删掉,那样会混乱。比如 1 2 1 1 2 3,遇到3了我们需要把map里的1清除掉,我们要连续着模拟:不要1,不要2,不要1,不要1,因为不可能只是不要所有的1,但2还留下的。

    int totalFruit(vector& vec) {
        unordered_map count;
        int start = 0;
        int res = 0;

        for (int end = 0; end < vec.size(); end++) {
            count[vec[end]]++;
            while (count.size() > 2) {
                count[vec[start]]--;
                if (count[vec[start]] == 0) {
                    count.erase(vec[start]);
                }
                start++;
            }
            res = max(res, end - start + 1);
        }
        return res;
    }

另外关于++a,和a++,如果不涉及return,返回值,或者赋值,就用任意都一样都可以

++a是先+再返回值

你可能感兴趣的:(代码随想录二刷,算法,矩阵,线性代数)