基础算法:滑动窗口_python版本

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

一、209. 长度最小的子数组

  • 思路:
    已每个位置为右端点,依次加大左端点,最短不满足 sum(numleft,right) < target的。
  • 代码:
python 复制代码
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 <= n else 0

二、713. 乘积小于 K 的子数组

  • 思路:
    和上一题一样,站在每个右端点,去找符合要求的左端点。
  • 代码:
python 复制代码
class Solution:
    def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
        if k <= 1:
            return 0
        ans = left = 0
        prod = 1
        for right, x in enumerate(nums):
            prod *= x
            while prod >= k:  # 不满足要求
                prod //= nums[left]
                left += 1
            ans += right - left + 1
        return ans

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

  • 思路1:
    还是一样,站在每个右端点,如果当前串内有重复的字符。依次移除左端点的
  • 代码:
python 复制代码
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字符在列表中的位置。
  • 代码:
python 复制代码
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
相关推荐
陈年老古董1 分钟前
PyTorch 实现 MNIST 手写数字识别学习笔记
笔记·python·深度学习·学习
其实防守也摸鱼1 分钟前
智能体推荐:精选 AI Agent 工具与实战指南
运维·开发语言·人工智能·学习·web安全·自动化
always_TT2 分钟前
【Python 字符串格式化:format() 方法】
android·开发语言·python
小义_6 分钟前
JDK 深度解析
java·linux·开发语言·python·面试
SendTomo9 分钟前
send.wang:基于浏览器WebRTC实现无客户端文件互传
网络·python·网络协议·webrtc·p2p
旖旎夜光16 分钟前
LeetCode 238:除自身以外数组的乘积(前缀和) —— 题解
数据结构·c++·算法·leetcode·前缀和
智购科技自动售货机工厂21 分钟前
2026自动售货机异常重启根因分析:从日志挖掘到内存取证的技术实践~YH
开发语言·数据库·单片机·嵌入式硬件·人机交互
一条大祥脚23 分钟前
26杭电暑期第八场(后半)快读|快写|tarjan|路径DP|mex转化|扫描线|前缀和|二分图
数据结构·算法·tarjan·杭电多校·强联通分量·动态规划dp
奈斯先生Vector26 分钟前
从“能调用”到“可运营”:AI Agent 进入多模型时代后的架构升级
java·javascript·数据库·人工智能·算法·架构·aigc
Escalating_xu27 分钟前
【C++类和对象(上)】从类的定义、封装与对象模型到内存对齐和 this 指针
开发语言·前端·c++