滑动窗口(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

相关推荐
独自破碎E12 小时前
【二分法】寻找峰值
算法
njsgcs12 小时前
ue python二次开发启动教程+ 导入fbx到指定文件夹
开发语言·python·unreal engine·ue
io_T_T12 小时前
迭代器 iteration、iter 与 多线程 concurrent 交叉实践(详细)
python
mit6.82412 小时前
位运算|拆分贪心
算法
华研前沿标杆游学12 小时前
2026年走进洛阳格力工厂参观游学
python
Carl_奕然12 小时前
【数据挖掘】数据挖掘必会技能之:A/B测试
人工智能·python·数据挖掘·数据分析
ghie909012 小时前
基于MATLAB的TLBO算法优化实现与改进
开发语言·算法·matlab
恋爱绝缘体112 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
wuk99812 小时前
VSC优化算法MATLAB实现
开发语言·算法·matlab
AI小怪兽13 小时前
基于YOLOv13的汽车零件分割系统(Python源码+数据集+Pyside6界面)
开发语言·python·yolo·无人机