/*
* @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
标签:map,rp,--,leetcode,int,result,lp,滑动,篇刷题
From: https://www.cnblogs.com/MR---Zhao/p/18031119