【leetcode】数组篇刷题 --滑动窗口
/* * @lc app=leetcode.cn id=209 lang=cpp * * [209] 长度最小的子数组 * 找最短的子数组 */ // @lc code=start class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { //滑动窗口, //一个计算总和 int sum = 0; //一个记录当前最短子串长度结果, int result = INT32_MAX; //一个慢指针,一个快指针,快指针匹配到子串,通过收缩慢指针达到缩小窗口(滑动窗口), int lp = 0; int rp = 0; int subLength = 0; for(;rp < nums.size(); rp++){ //计算当前滑动窗口内子串长度 sum += nums[rp]; //匹配到了sum == target的子串 while(sum >= target){ subLength = (rp - lp + 1); result = result < subLength ? result : subLength; //滑动窗口向右移动(即向右缩小滑动窗口) sum -= nums[lp++]; } } return result == INT32_MAX ? 0 : result; } }; // @lc code=end
/* * @lc app=leetcode.cn id=904 lang=cpp * * [904] 水果成篮 */ // @lc code=start class Solution { public: int totalFruit(vector<int>& fruits) { //一个map统计果篮中A,B两种水果各自的数量,一但果篮中放入水果C,就扔掉所有A类水果 unordered_map<int, int> map; //一对快慢指针 int rp = 0; int lp = 0; //记录最长子序列 int result = 0; for(;rp < fruits.size(); rp++){ // ++map[fruits[rp]]; //记录某一类型水果并统计其数量 map[fruits[rp]]++; //果篮中放入了第3种水果 while(map.size() > 2){ //扔掉最先放入的所有A类水果 //获取指向该键值对的迭代器 auto it = map.find(fruits[lp]); //first为key,second为value (it->second)--; //A类水果已扔完 if(it->second == 0){ map.erase(it); } //扔水果的同时缩小滑动窗口(仍水果正是处于此目的) lp++; } result = max(result, rp - lp + 1); } return result; } }; // @lc code=end
本文来自博客园,作者:main(void),转载请注明原文链接:https://www.cnblogs.com/MR---Zhao/p/18031119
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理