力扣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]
相关推荐
地平线开发者10 小时前
J6B vio scenario sample
算法
SelectDB16 小时前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
BothSavage1 天前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn1 天前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
烬羽1 天前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
荣码1 天前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
金銀銅鐵1 天前
[Python] 基于欧几里得算法,实现分数约分计算器
python·数学
Lyn_Li2 天前
Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现
python·kaggle·比赛复盘·金融预测