滑动窗口与双指针(1)——定长
class Solution(object):def maxVowels(self, s, k):ans = vowel = 0for i, w in enumerate(s):if w in 'aeiou':vowel += 1left = i - k + 1if left < 0:continueans = max(ans, vowel)if ans == k:breakif s[left] in 'aeiou':vowel -= 1return ans
口诀:进入——更新——出去
class Solution:def findMaxAverage(self, nums: List[int], k: int) -> float:ans = -inftmp = 0for i, e in enumerate(nums):tmp += eleft = i - k + 1if left < 0:continueans = max(ans, tmp)tmp -= nums[left]return ans / k
class Solution:def numOfSubarrays(self, arr: List[int], k: int, threshold: int) -> int:threshold = threshold * knum = sum = 0for i in range(len(arr)):sum += arr[i]left = i - k + 1if left < 0:continueif sum >= threshold:num += 1sum -= arr[left]return num
class Solution:def getAverages(self, nums: List[int], k: int) -> List[int]:ans = [-1]*len(nums)tmp = 0if k == 0:return numsfor i in range(len(nums)):tmp += nums[i]if i < k*2:continueans[i - k] = tmp // (k*2+1)tmp -= nums[i - k*2]return ans
class Solution:def minimumRecolors(self, blocks: str, k: int) -> int:ans = float(inf)tmp = 0for i, e in enumerate(blocks):if e == 'W':tmp += 1if i <= k-2:continueans = min(ans, tmp)if blocks[i - k + 1] == 'W':tmp -= 1return ans
class Solution:def maxSum(self, nums: List[int], m: int, k: int) -> int:ans = sum = 0cnt = defaultdict(int)for i, e in enumerate(nums):sum += ecnt[e] += 1if i - k + 1 < 0:continueif len(cnt) >= m:ans = max(ans, sum)out = nums[i-k+1]sum -= outcnt[out] -= 1if cnt[out] == 0:del cnt[out]return ans
这道题的关键是用了字典,而且注意如果字典的value为0,就要删除对应的键值对,不然会影响字典的长度
class Solution:def maximumSubarraySum(self, nums: List[int], k: int) -> int:ans = sum = 0cnt = defaultdict(int)for i, e in enumerate(nums):sum += ecnt[e] += 1if i < k - 1:continueif len(cnt) == k:ans = max(ans, sum)out = nums[i-k+1]sum -= outcnt[out] -= 1if cnt[out] == 0:del cnt[out]return ans
跟上道题思路一模一样
class Solution:def maxScore(self, cardPoints: List[int], k: int) -> int:n = len(cardPoints)m = n - ks = ans = sum(cardPoints[:m])for i in range(m, n):s += cardPoints[i] - cardPoints[i-m]ans = min(s, ans)return sum(cardPoints) - ans
逆向思维,算拿完牌剩下的牌的最小值
class Solution:def maxSatisfied(self, customers: List[int], grumpy: List[int], minutes: int) -> int:s = [0, 0]m = 0for i, (c, g) in enumerate(zip(customers, grumpy)):s[g] += cif i < minutes - 1:continuem = max(m, s[1])if grumpy[i-minutes+1]:s[1] -= customers[i-minutes+1]return s[0] + m
这道题拆分为所有不生气的 +((窗口内生气的)最大值)