查看: 954| 回复: 1
跳转到指定楼层
上一主题 下一主题
收起左侧

[高频题] 滑动窗口 第一讲

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
某一类题做多了就发现其实里面都有固定的一个套路,在一个套路下在做不同的延伸。联想到其实人跟人的交往也是差不多,有一些固定的套路。比如一个人找你聊天,大概率那个人不在乎你说啥,ta只在乎ta要说啥。你这时候要确定一点,ta为啥找你说(ta是觉得你是一个可靠的朋友和聆听者 还是 一个情绪垃圾桶),你值不值得花时间听ta说(那你觉得ta是把你当垃圾桶,还是可靠的朋友)。而不是要怎么帮ta解决问题。 扯远了回到滑动窗口问题

套路1: i j 齐头并进,while循环处理条件。
题目:209, 713, 1004, 2024

209:题目要求,找到最小连续subarray,这个subarray的和刚好是target。
那么看到连续的subarray 基本上就可以嘴角上扬了。这就是一个典型的滑窗问题。

思路:
1. 找最小那么就需要一个最大值,设置变量1 res = Integer.MAX_VALUE 和变量2 count = 0 (用来计算subarry的和)
2. for 循环 设置 左右窗口 i j 来循环整个array
3. count 加上右窗口走过的数
4. 当count >= target 的时候 呼叫while 来找寻最小区间
5. 找寻最小区间,顺便动用 左框 压缩subarray
6. 注意有可能不存在因此还要在return的时候判断一下 不存在就return 0
代码如下

  1. class Solution {
  2.     public int minSubArrayLen(int target, int[] nums) {
  3.         int res = Integer.MAX_VALUE;
  4.         int count = 0;
  5.         for(int i = 0, j = 0; i < nums.length; i++){
  6.             count += nums[i];
  7.             while(count >= target){
  8.                 res = Math.min(i - j + 1, res);
  9.                 count -= nums[j++];
  10.             }
  11.         }
  12.         return res == Integer.MAX_VALUE ? 0 : res ;
  13.     }
  14. }
复制代码
第二题,subarray product less than k
一般碰到这种题,就基本上确定要使用 滑动窗口 + prefix sum的战术了
基本上套路和第一题一样。
i j 齐头并进 while循环处理特殊情况
这次的图书情况是 subarray的product 必须小于k 因此 while循环就处理 > k的情况。范围控制就在while之外搜索
特别注意的一点是 注意 右窗口别超过左窗口

  1. class Solution {
  2.     public int numSubarrayProductLessThanK(int[] nums, int k) {
  3.         int res  = 0;
  4.         int count = 1;
  5.         for(int i = 0, j = 0; i < nums.length; i++){
  6.             count *= nums[i];
  7.            // 注意左右窗口
  8.             while(j <= i && count >= k){
  9.                 count /= nums[j++];
  10.             }
  11.             res += i - j + 1;
  12.         }
  13.         return res;
  14.     }
  15. }
复制代码
1004 哎呦 这题更明显了,就差名字起名叫 我是滑动窗口了
这题主要检测 k, 设置一个临时变量,右窗口是0 就把临时变量count ++, 当超过了 k 就开始缩小subarray
然后找到max subarray

  1. class Solution {
  2.     public int longestOnes(int[] nums, int k) {
  3.         int res = 0, count = 0;
  4.         for(int i = 0, j = 0; i < nums.length; i++){
  5.             if(nums[i] == 0) count++;
  6.             while(count > k){
  7.                 if(nums[j] == 0) count --;
  8.                 j++;
  9.             }
  10.             res = Math.max(i - j + 1, res);
  11.         }
  12.         return res;
  13.     }
  14. }
复制代码
2024 是我认为这四道题里 最难的一题。难在这题是为了做题而出的,没有什么人类的行为逻辑可言
歌词大意就是超过了k个 就把t换成f 或者f换成t 看最长的subarray是多少。一开始读题的时候,我一直在想为什么。后来就觉得跟抖音一样,有些视频他就是没有逻辑。就是很烂。下滑就好了

题还是要做的

  1. class Solution {
  2.     public int maxConsecutiveAnswers(String answerKey, int k) {
  3.         int res = 0, countF = 0, countT = 0;
  4.         for(int i = 0, j = 0; i < answerKey.length(); i++){
  5.             char ch = answerKey.charAt(i);
  6.             if(ch == 'F') countF ++;
  7.             else countT ++;
  8.             while(countF > k && countT > k){
  9.                 char temp = answerKey.charAt(j);
  10.                 if(temp == 'F') countF --;
  11.                 else countT --;
  12.                 j++;
  13.             }
  14.             res = Math.max(i - j + 1, res);
  15.         }
  16.         return res;
  17.     }
  18. }
复制代码

评分

参与人数 1大米 +10 收起 理由
14417335 + 10 给你点个赞!

查看全部评分


上一篇:诚心请教React入门教程
下一篇:[求助帖] 雨林OA AnsweredNeeded
🔗
开心的猪 2021-12-16 05:23:28 | 只看该作者
全局:
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表