滑动窗口(2)——不定长

python 复制代码
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        cnt = defaultdict(int)
        left = res = 0
        for i, e in enumerate(s):
            cnt[e] += 1
            while cnt[e] > 1:
                cnt[s[left]] -= 1
                left += 1
            res = max(res, i - left + 1)
        return res
        
python 复制代码
class Solution:
    def maximumLengthSubstring(self, s: str) -> int:
        cnt = defaultdict(int)
        left = ans = 0
        for right, e in enumerate(s):
            cnt[e] += 1
            while cnt[e] > 2:
                cnt[s[left]] -= 1
                left += 1
            ans = max(ans, right - left + 1)
        return ans
python 复制代码
class Solution:
    def longestSubarray(self, nums: List[int]) -> int:
        cnt_0 = 0
        left = ans = 0
        for right, e in enumerate(nums):
            if e == 0:
                cnt_0 += 1
            while cnt_0 > 1:
                if nums[left] == 0:
                    cnt_0 -= 1
                left += 1
            ans = max(ans, right - left)
        
        return ans
python 复制代码
class Solution:
    def minRemoval(self, nums: List[int], k: int) -> int:
        nums.sort()
        left = ans = 0
        for i, e in enumerate(nums):
            while nums[left] * k < e:
                left += 1
            ans = max(ans, i - left + 1)
        return len(nums) - ans
python 复制代码
class Solution:
    def equalSubstring(self, s: str, t: str, maxCost: int) -> int:
        cnt = 0
        ans = left = 0
        for i in range(len(s)):
            cnt += abs(ord(s[i]) - ord(t[i]))       
            while cnt > maxCost:
                cnt -= abs(ord(s[left]) - ord(t[left]))
                left += 1
            ans = max(ans, i - left + 1)
        return ans
python 复制代码
class Solution:
    def totalFruit(self, fruits: List[int]) -> int:
        cnt = defaultdict(int)
        left = ans = 0
        for i, e in enumerate(fruits):
            cnt[e] += 1
            while len(cnt) > 2:
                out = fruits[left]
                cnt[out] -= 1
                if cnt[out] == 0:
                    del cnt[out]
                left += 1
            ans = max(ans, i - left + 1)
        return ans
        
python 复制代码
class Solution:
    def maximumUniqueSubarray(self, nums: List[int]) -> int:
        cnt = defaultdict(int)
        left = ans = tmp = 0
        for i, e in enumerate(nums):
            cnt[e] += 1
            tmp += e
            while cnt[e] > 1:
                out = nums[left]
                cnt[out] -= 1
                left += 1
                tmp -= out
            ans = max(ans, tmp)
        return ans
python 复制代码
class Solution:
    def fun(self, nums, goal):
        s = cnt = left =  0
        for i, e in enumerate(nums):
            s += e
            while s >= goal and left <= i:
                out = nums[left]
                s -= out
                left += 1
            cnt += left
        return cnt
    def numSubarraysWithSum(self, nums: List[int], goal: int) -> int:
        upper = self.fun(nums, goal)
        lower = self.fun(nums, goal + 1)
        return upper - lower
        

答案就是元素和≥k的子数组个数,减去元素和≥k + 1的子数组个数。

python 复制代码
class Solution:
    def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
        if k <= 1:
            return 0
        left = cnt = 0
        tmp = 1
        for i, e in enumerate(nums):
            tmp *= e
            while tmp >= k:
                tmp //= nums[left]
                left += 1
            cnt += i - left + 1
        return cnt

这个注意的是left和right中间的都算

python 复制代码
class Solution:
    def numberOfSubstrings(self, s: str) -> int:
        cnt = defaultdict(int)
        left = ans = 0
        for i, e in enumerate(s):
            cnt[e] += 1
            while len(cnt) == 3:
                out = s[left]
                cnt[out] -= 1
                left += 1
                if cnt[out] == 0:
                    del cnt[out]
            ans += left
        return ans
        
python 复制代码
class Solution:
    def maxConsecutiveAnswers(self, answerKey: str, k: int) -> int:
        cnt = defaultdict(int)
        ans = left = 0
        for i, e in enumerate(answerKey):
            cnt[e] += 1
            while cnt['T'] > k and cnt['F'] > k:
                out = answerKey[left]
                cnt[out] -= 1
                left += 1
            ans = max(ans, i - left + 1)
        return ans

如果 T 和 F 的出现次数都超过 k,就移动左端点 left,直到 T 和 F 的出现次数至少有一个 ≤k

相关推荐
JieE21210 小时前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
金銀銅鐵15 小时前
[Python] 从《千字文》中随机挑选汉字
后端·python
cup1120 小时前
[技术复盘] Windows Python 打包实战:Nuitka 环境踩坑总结与 CI 自动化构建全指南
python·ai·环境变量·ci·nuitka·skill
aqi001 天前
15天学会AI应用开发(七)有了大模型为什么还要引入RAG
人工智能·python·大模型·ai编程·ai应用
金銀銅鐵1 天前
用 Python 实现 Take-Away 游戏
python·游戏
copyer_xyf1 天前
Agent 流程编排
后端·python·agent
copyer_xyf1 天前
Agent RAG
后端·python·agent
copyer_xyf1 天前
【RAG】向量数据库:milvus
后端·python·agent
copyer_xyf1 天前
Agent 记忆管理
后端·python·agent