代码随想录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;
    }
};
相关推荐
wuminyu1 小时前
Java锁机制之park与futex系统级协同机制解析
java·linux·c语言·jvm·c++
疯狂打码的少年1 小时前
编译程序与解释程序的区别
java·开发语言·笔记
小雨下雨的雨5 小时前
井字棋AI机器人实现详解 - Minimax算法实战-鸿蒙PC Electron框架完成
前端·人工智能·算法·华为·electron·鸿蒙
xieliyu.8 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
明夜之约8 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee8 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Jinkxs8 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
辣机小司8 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录
一条小锦吕*8 小时前
基于Spring Boot + 数据可视化 + 协同过滤算法的推荐系统设计与实现(源码+论文+部署全讲解)
spring boot·算法·信息可视化
fangdengfu1239 小时前
ES分析系统各个服务日志占用量
java·前端·elasticsearch