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

相关推荐
CAE32043 分钟前
基于机器学习的智能垃圾短信检测超强系统
人工智能·python·机器学习·自然语言处理·垃圾短信拦截
MarcoPage2 小时前
Python 字典推导式入门:一行构建键值对映射
java·linux·python
星释6 小时前
Rust 练习册 :Pythagorean Triplet与数学算法
开发语言·算法·rust
星释6 小时前
Rust 练习册 :Nth Prime与素数算法
开发语言·算法·rust
ζั͡山 ั͡有扶苏 ั͡✾7 小时前
从零搭建 Data-Juicer:一站式大模型数据预处理与可视化平台完整教程
python·data-juicer
多喝开水少熬夜7 小时前
Trie树相关算法题java实现
java·开发语言·算法
WBluuue7 小时前
数据结构与算法:树上倍增与LCA
数据结构·c++·算法
SkylerHu7 小时前
tornado+gunicorn部署设置max_body_size
python·tornado·gunicorn
bruk_spp8 小时前
牛客网华为在线编程题
算法
独行soc8 小时前
2025年渗透测试面试题总结-234(题目+回答)
网络·python·安全·web安全·渗透测试·1024程序员节·安全狮