代码随想录day2 滑动窗口

209长度最小的子数组

先贴代码

cpp 复制代码
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums)
    {
        int left=0;
        int right=0;
        int sum=0;
        int res=0;
        while(right<nums.size())
        {
            sum+=nums[right++];
            while(sum>=target)
            {
                res=res==0?right-left:min(res,right-left);
                sum-=nums[left++];
            }
        }
        return res;
    }
};

再贴一个滑动窗口的模板

cpp 复制代码
int left = 0, right = 0;
while (right < s.size()) {
 // 增⼤窗⼝
 window.add(s[right]);
 right++;
 
 while (window needs shrink) {
 // 缩⼩窗⼝
 window.remove(s[left]);
 left++;
 }
}

904. 水果成篮

cpp 复制代码
class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int l = 0;
        int r = 0;
        int ans = 0;
        unordered_map<int, int> cnt;
        while (r < fruits.size()) {
            cnt[fruits[r]]++;
            r++;
            while (cnt.size() > 2) {
                cnt[fruits[l]]--;
                if (cnt[fruits[l]] == 0) {
                    cnt.erase(fruits[l]);
                }
                l++;
            }
            ans = ans == 0 ? r - l : max(ans, r - l);
        }
        return ans;
    }
};

76. 最小覆盖子串

cpp 复制代码
class Solution {
public:
    string minWindow(string s, string t) {
        if (t.length() > s.length())
            return "";
        unordered_map<char, int> window, need;
        for (auto a : t)
            need[a]++;
        int l = 0, r = 0;
        int valid = 0;
        int start = 0;
        int len = INT_MAX;
        while (r < s.size()) {
            auto c = s[r++];
            if (need.count(c)) {
                window[c]++;
                if (window[c] == need[c]) {
                    valid++;
                }
            }
            while (valid == need.size()) {
                if (r - l < len) {
                    start = l;
                    len = r - l;
                }
                auto d = s[l++];
                if (need.count(d)) {
                    if (window[d] == need[d]) {
                        valid--;
                    }
                    window[d]--;
                }
            }
        }
        return len == INT_MAX ? "" : s.substr(start, len);
    }
};

整体思路上是一样的,问题的关键是怎么表示窗口扩展和缩减,以及条件的满足。

59. 螺旋矩阵 II

cpp 复制代码
class Solution {
    static constexpr int DIRS[4][2] = {
        {0, 1}, {1, 0}, {0, -1}, {-1, 0}}; // 右下左上
public:
    vector<vector<int>> generateMatrix(int n) {
        vector ans(n, vector<int>(n));
        int i = 0, j = 0, di = 0;
        for (int val = 1; val <= n * n; val++) { // 要填入的数
            ans[i][j] = val;
            int x = i + DIRS[di][0];
            int y = j + DIRS[di][1]; // 下一步的位置
            // 如果 (x, y) 出界或者已经填入数字
            if (x < 0 || x >= n || y < 0 || y >= n || ans[x][y]) {
                di = (di + 1) % 4; // 右转 90°
            }
            i += DIRS[di][0];
            j += DIRS[di][1]; // 走一步
        }
        return ans;
    }
};

灵神是怎么写这么nb的

54 螺旋矩阵

cpp 复制代码
class Solution {
    static constexpr int DIRS[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; // 右下左上
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        vector<int> ans(m * n);
        int i = 0, j = 0, di = 0;
        for (int k = 0; k < m * n; k++) { // 一共走 mn 步
            ans[k] = matrix[i][j];
            matrix[i][j] = INT_MAX; // 标记,表示已经访问过(已经加入答案)
            int x = i + DIRS[di][0];
            int y = j + DIRS[di][1]; // 下一步的位置
            // 如果 (x, y) 出界或者已经访问过
            if (x < 0 || x >= m || y < 0 || y >= n || matrix[x][y] == INT_MAX) {
                di = (di + 1) % 4; // 右转 90°
            }
            i += DIRS[di][0];
            j += DIRS[di][1]; // 走一步
        }
        return ans;
    }
};
相关推荐
小肝一下几秒前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
劈星斩月7 分钟前
监督学习算法 之 决策树
学习·算法·决策树
学计算机的计算基12 分钟前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana216 分钟前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
万亿少女的梦16835 分钟前
基于Spring Boot、Java与MySQL的网络订餐系统设计与实现
java·spring boot·mysql·系统设计·网络订餐
To_OC8 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
咩咩啃树皮9 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
旖-旎9 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
鱟鲥鳚10 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
To_OC10 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode