力扣hot100_子串_python版本

一、560. 和为 K 的子数组

  • 思路:这就是一道典型的前缀和的题
  • 代码:
python 复制代码
class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        presum = [0] * (len(nums) + 1)
        for i, x in enumerate(nums):
            presum[i + 1] = presum[i] + x  # 前缀和序列需要n+1个

        ans = 0
        cnt = defaultdict(int)
        for p in presum:
            ans += cnt[p - k]
            cnt[p] += 1
        return ans

二、239. 滑动窗口最大值

  • 思路1:暴力。这道题如果暴力求解其实很简单,根据描述写就行了,但是复杂度比较高, O ( n 2 ) O(n^2) O(n2)
  • 代码
python 复制代码
class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        if len(nums) == 1:
            return nums
        res = []
        left, right = 0, k
        while left <= (len(nums)-k):
            res.append(max(nums[left:right]))
            left+=1
            right+=1
        return res
  • 思路2:单调队列。单调队列分为3步
    1. 入(元素入队尾,并维护单调性(看需要保持单增,还是单减))
    2. 出(元素离开队首)
    3. 记录答案
  • 代码
python 复制代码
class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        ans = []
        q = deque()
        for i, x in enumerate(nums):
            # 入
            while q and nums[q[-1]] <= x:
                q.pop()  # 删除比x小的元素(找最大值,比x小的就不用看了)
            q.append(i)  # 加入到队尾(这个队列也是单调的了)

            # 出
            if i - q[0] >= k:  # 队首需要离开了(滑窗滑过了)
                q.popleft()
            
            # 记录
            if i >= k - 1:
                ans.append(nums[q[0]])
        retrun ans 

三、76. 最小覆盖子串

  • 思路:这里很神奇,Counter()这玩儿意可以比较,当然如果没法比较也可以自己写一个比较函数
  • 代码:
python 复制代码
class Solution:
    def minWindow(self, s, t):
        ansLeft, ansRight = -1, len(s)
        cntS = Counter()
        cntT = Counter(t)

        left = 0
        for right, word in enumerate(s):
            cntS[word] += 1
            while cntS >= cntT:
                if right - left < ansRight - ansLeft:
                    ansLeft, ansRight = left, right
                cntS[s[left]] -= 1
                left += 1
        return "" if ansLeft < 0 else s[ansLeft:ansRight+1]
相关推荐
颜酱1 小时前
二叉树分解问题思路解题模式
javascript·后端·算法
zone77391 小时前
001:简单 RAG 入门
后端·python·面试
F_Quant1 小时前
🚀 Python打包踩坑指南:彻底解决 Nuitka --onefile 配置文件丢失与重启报错问题
python·操作系统
允许部分打工人先富起来2 小时前
在node项目中执行python脚本
前端·python·node.js
IVEN_2 小时前
Python OpenCV: RGB三色识别的最佳工程实践
python·opencv
qianpeng8972 小时前
水声匹配场定位原理及实验
算法
haosend3 小时前
AI时代,传统网络运维人员的转型指南
python·数据网络·网络自动化
曲幽3 小时前
不止于JWT:用FastAPI的Depends实现细粒度权限控制
python·fastapi·web·jwt·rbac·permission·depends·abac
董董灿是个攻城狮14 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
IVEN_21 小时前
只会Python皮毛?深入理解这几点,轻松进阶全栈开发
python·全栈