【滑动窗口:209 长度最小子数组 904.水果成篮 76.最小覆盖子串】
209长度最小子数组
sum要达到target,自己滑动窗口法ac,不断往前囊括新的一个,然后试着从头减少一个个,看sum还够不够
mycode:
int minSubArrayLen(int target, vector<int>& nums) {int minlen=200000;int sum=0;int fast=0;int slow=0;while(fast<nums.size()){sum+=nums[fast];while(sum-nums[slow]>=target && slow<=fast){sum-=nums[slow];slow++;}if(sum>=target) minlen=min(minlen,fast-slow+1);fast++;}return minlen==200000?0:minlen;}
逻辑整理的更简洁:
int minSubArrayLen(int target, vector<int>& nums) {int minlen=200000;int sum=0;int fast=0;int slow=0;while(fast<nums.size()){sum+=nums[fast];while(sum>=target){minlen=min(minlen,fast-slow+1);sum-=nums[slow++];}fast++;}return minlen==200000?0:minlen;}
904 水果成篮
一刷,快写出来但没写出来。数据结构unordered map选对了,我的问题出在前面的要一个一个减去,不能一下子把前面某个直接设为0,从map里删掉,那样会混乱。比如 1 2 1 1 2 3,遇到3了我们需要把map里的1清除掉,我们要连续着模拟:不要1,不要2,不要1,不要1,因为不可能只是不要所有的1,但2还留下的。
int totalFruit(vector<int>& vec) {unordered_map<int, int> count;int start = 0;int res = 0;for (int end = 0; end < vec.size(); end++) {count[vec[end]]++;while (count.size() > 2) {count[vec[start]]--;if (count[vec[start]] == 0) {count.erase(vec[start]);}start++;}res = max(res, end - start + 1);}return res;}
另外关于++a,和a++,如果不涉及return,返回值,或者赋值,就用任意都一样都可以
++a是先+再返回值