代码随想录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;
    }
};
相关推荐
ID_1800790547312 小时前
企业级淘宝评论 API最简说明,JSON 返回示例
java·服务器·前端
Plan-C-12 小时前
二叉树的遍历
java·数据结构·算法
历程里程碑12 小时前
54 深入解析poll多路复用技术
java·linux·服务器·开发语言·前端·数据结构·c++
靠沿12 小时前
【动态规划算法】专题二——路径问题
算法·动态规划
手写码匠12 小时前
手写 AI 推理加速引擎:从零实现 KV Cache 与 Speculative Decoding
人工智能·深度学习·算法·aigc
无限进步_13 小时前
【C++】可变参数模板与emplace系列
java·c++·算法
一切皆是因缘际会13 小时前
AI Agent落地困局与突破:从技术架构到企业解析
数据结构·人工智能·算法·架构
sheeta199813 小时前
LeetCode 每日一题笔记 日期:2026.05.16 题目:154. 寻找旋转排序数组中的最小值 II
笔记·算法·leetcode
计算机安禾13 小时前
【c++面向对象编程】第28篇:new/delete vs malloc/free:C++中正确动态内存管理
开发语言·c++·算法
qeen8713 小时前
【算法笔记】各种常见排序算法详细解析(下)
c语言·数据结构·c++·笔记·学习·算法·排序算法