《力扣面试150题》题单拓展——滑动窗口

发布时间 2023-12-01 21:21:02作者: 小柴cyl

《力扣面试150题》题单拓展——滑动窗口

1.基础知识

先区分好,枚举右端点,还是左端点,

窗口内的条件改变后,一般都是while控制另一个窗口的移动,然后收集结算

我感觉滑动窗口这里变动最大的,什么时候去滑动左窗口,什么时候去收集答案,都很不一样,得慢慢体会

滑动窗口难题是真的难,呜呜呜呜枯了

//把char转为int  0~255
//可以直接vector[string[2]]++;
int findSubArray(vector<int> &nums){
    int n = nums.size();
    int l = 0;
    int ans = 0;
    for(int r=0; r<n; r++){
        sum += nums[r];		//增加当前右边指针的数字/字符的求和/计数
        while([l, r]不符合题意){		//就是什么时候刚刚开始可以缩进左窗口
            sum -= nums[l];
            l++;
        }
        //需要判断结算是否需要条件
        ans = max(ans, r-l+1);		//结算
    }
    return ans;
}

2.常规窗口

209.长度最小的子数组

枚举右端点,更新sum后,满足条件时,缩进左窗口,结算


713.乘积小于K的子数组

更新mul后,立即判断左窗口的移动,结算

这里结算也需要条件,因为可能是因为窗口l >r 导致的缩进左窗口退出循环


3.无重复字符的最长子串 思想

1.进新来字符后,先while判断怎么移动左窗口,然后收集,借助了set

什么时候缩进左窗口:当新建来的集合里面已经可以找到的时候,刚进来就可以结算,所以不在条件里面

2.跳动窗口,左窗口一直更新为max(s[r]上次出现的位置+1,l),利用了这种特性来进行了窗口内的去重

3.转变窗口内的统计

1004.最大连续1的个数III 难度分:1656

把1的个数,转变为统计窗口内0的个数,绝杀啊

什么时候开始缩进左窗口:窗口内0的个数 > k的时候,缩进外面结算,因为刚进来也会满足条件,所以结算可以不放在条件里面


76.最小覆盖子串

把窗口内的要求转存为了一张数组,满足要求时缩进左窗口,很细

这个题是什么时候开始缩进左窗口:标记刚还清账本的时候开始缩进,去掉左边无关紧要的字符,缩进完毕就可以结算了(因为不是一进来就会满足,所以结算要放在if()里面)


239.滑动窗口最大值

和单调队列进行结合,维护窗口大小的队列,入队,弹出,结算,

4.上难度

1234.替换子串得到平衡字符串 难度分:1878