滑动窗口刷题(一)&滑动窗口讲解

 所有算法文章链接(最底部)

http://t.csdnimg.cn/IbllR

 

目录

算法讲解

看到一道题如何想到滑动窗口

步骤:

1.长度最小子数组

解题思路

代码编写

2.无重复最长字串

解题思路

代码编写


算法讲解

看到一道题如何想到滑动窗口

如果这道题的暴力解法可以被同向的双指针(两个指针同时向后走)所优化,第一时间就要想到滑动窗口。

步骤:

1.进窗口

2.判断

3.根据判断出窗口

4.更新结果(位置不固定,可能在出窗口之前更新,也可能之后)

1.长度最小子数组

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

解题思路

1.用left,right两个指针维护一个窗口

2.right向后遍历,把right指向的元素加到sum(进窗口)

3.如果窗口的和sum>=targert出窗口(判断)

4.把left指向的元素从sum中减出去(出窗口)

代码编写

int minSubArrayLen(int target, vector<int>& nums)
{
   int n = nums.size(), sum = 0, len = INT_MAX;
   for(int left = 0, right = 0; right < n; right++)
   {
      sum += nums[right]; // 进窗⼝
       while(sum >= target) // 判断
       {
       len = min(len, right - left + 1); // 更新结果
       sum -= nums[left++]; // 出窗⼝
       }
   } 
       return len == INT_MAX ? 0 : len;
   
}

2.无重复最长字串

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

解题思路

1.left,right两个指针维护一个窗口

2.将right的指向的元素加入哈希表中(进窗口)

3.right指向的元素在哈希表中是否出现

4.判断为真 ,将left指向的元素从哈希表中删除,直到重复的元素出现次数为一。

代码编写

int lengthOfLongestSubstring(string s)
{
    int hash[128] = { 0 }; // 使⽤数组来模拟哈希表
    int left = 0, right = 0, n = s.size();
    int ret = 0;

    while(right < n)
    {
      hash[s[right]]++; // 进⼊窗⼝
      while(hash[s[right]] > 1) // 判断
      hash[s[left++]]--; // 出窗⼝
      ret = max(ret, right - left + 1); // 更新结果
      right++; // 让下⼀个元素进⼊窗⼝
    }
    return ret;
}

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值