代码随想录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;
    }
};
相关推荐
Leinwin30 分钟前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
无极低码37 分钟前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
薛定谔的悦41 分钟前
MQTT通信协议业务层实现的完整开发流程
java·后端·mqtt·struts
软件算法开发1 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
enjoy嚣士1 小时前
springboot之Exel工具类
java·spring boot·后端·easyexcel·excel工具类
罗超驿1 小时前
独立实现双向链表_LinkedList
java·数据结构·链表·linkedlist
superior tigre2 小时前
22 括号生成
算法·深度优先
盐水冰2 小时前
【烘焙坊项目】后端搭建(12) - 订单状态定时处理,来单提醒和顾客催单
java·后端·学习
凸头2 小时前
CompletableFuture 与 Future 对比与实战示例
java·开发语言
wuqingshun3141592 小时前
线程安全需要保证几个基本特征
java·开发语言·jvm