基础算法:滑动窗口

06-02 1581阅读

能使用滑动窗口的题,基本都需要数字为正整数,这样才能保证滑入一个数字总和是增加的(单调性)

一、209. 长度最小的子数组基础算法:滑动窗口

  • 思路:

    已每个位置为右端点,依次加大左端点,最短不满足 sum(num[left,right])

  • 代码:
    class Solution:
        def minSubArrayLen(self, target: int, nums: List[int]) -> int:
            n = len(nums)
            ans = n + 1  # 也可以写 inf
            s = left = 0
            for right, x in enumerate(nums):  # 枚举子数组右端点
                s += x
                while s >= target:  # 满足要求
                    ans = min(ans, right - left + 1)
                    s -= nums[left]
                    left += 1  # 左端点右移
            return ans if ans  int:
            if k = k:  # 不满足要求
                    prod //= nums[left]
                    left += 1
                ans += right - left + 1
            return ans
    

    三、3. 无重复字符的最长子串

    基础算法:滑动窗口

    • 思路1:

      还是一样,站在每个右端点,如果当前串内有重复的字符。依次移除左端点的

    • 代码:
      class Solution:
          def lengthOfLongestSubstring(self, s: str) -> int:
              ans = left = 0
              cnt = defaultdict(int)  # 维护从下标 left 到下标 right 的字符及其出现次数
              for right, c in enumerate(s):
                  cnt[c] += 1
                  while cnt[c] > 1:  # 窗口内有重复字母
                      cnt[s[left]] -= 1  # 移除窗口左端点字母
                      left += 1  # 缩小窗口
                  ans = max(ans, right - left + 1)  # 更新窗口长度最大值
              return ans
      
      • 思路2:

        依次遍历s,不是重复字符直接加入并计算长度,遇到重复字符,那么当前字符要退出到上一个重复位置。列表可采用 list.index(i),找到i字符在列表中的位置。

      • 代码:
        class Solution:
            def lengthOfLongestSubstring(self, s: str) -> int:
                tmp_s = []
                max_len = 0
                for i in s:
                    if i not in tmp_s:
                        tmp_s.append(i)
                        max_len = max(max_len, len(tmp_s))
                    else:
                        index = tmp_s.index(i)               
                        tmp_s = tmp_s[index+1:]
                        tmp_s.append(i)
                return max_len
        
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码