给你一个由 n
个元素组成的整数数组 nums
和一个整数 k
。
请你找出平均数最大且 长度为 k
的连续子数组,并输出该最大平均数。
任何误差小于 10-5
的答案都将被视为正确答案
输入:nums = [1,12,-5,-6,50,3], k = 4 输出:12.75 解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
class Solution(object):
def findMaxAverage(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: float
"""
left = 0
right = left + k - 1
i = 0
windowSum = 0
while i < k:
windowSum += nums[i]
i += 1
maxAvg = windowSum / float(k)
while right + 1 < len(nums):
windowSum = windowSum - nums[left] + nums[right+1]
maxAvg = max(maxAvg, windowSum / float(k))
left += 1
right += 1
return maxAvg
k不变,可以先求区间最大和,最后再除
给你字符串 s
和整数 k
。
请返回字符串 s
中长度为 k
的单个子字符串中可能包含的最大元音字母数。
英文中的 元音字母 为(a
, e
, i
, o
, u
)。
分析:
先计算初始窗口元音的个数
窗口移动,1 右端进入元音 左边退出非元音 最大个数+1
2 右端进入元音 左边退出元音 最大个数不变
3 右边进入非元音 无论左边退出什么 最大个数不变
s所以仅在情况1时重新计算窗口中的元音个数,然后与maxCount比较
(附自己的代码,超时了。。)
class Solution(object):
def maxVowels(self, s, k):
"""
:type s: str
:type k: int
:rtype: int
"""
yuanyin = ['a', 'e', 'i', 'o', 'u']
left = 0
right = left + k - 1
maxCount = 0
i = 0
while i <= right:
if s[i] in yuanyin:
maxCount += 1
i += 1
while right + 1 < len(s):
currentCount = 0
if s[right+1] in yuanyin and s[left] not in yuanyin:
i = left + 1
while i <= right + 1:
if s[i] in yuanyin:
currentCount += 1
i += 1
maxCount = max(currentCount, maxCount)
left += 1
right += 1
return maxCount
修改版:勉强通过,去掉了双重循环,每次记录窗口的元音个数
class Solution(object):
def maxVowels(self, s, k):
"""
:type s: str
:type k: int
:rtype: int
"""
yuanyin = ['a', 'e', 'i', 'o', 'u']
left = 0
right = left + k - 1
maxCount = 0
i = 0
while i <= right:
if s[i] in yuanyin:
maxCount += 1
i += 1
currentCount = maxCount
while right + 1 < len(s):
if s[right+1] in yuanyin and s[left] not in yuanyin:
currentCount += 1
if s[right+1] not in yuanyin and s[left] in yuanyin:
currentCount -= 1
maxCount = max(currentCount, maxCount)
left += 1
right += 1
return maxCount
给定一个二进制数组 nums
和一个整数 k
,如果可以翻转最多 k
个 0
,则返回 数组中连续 1
的最大个数 。
输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2 输出:6 解释:[1,1,1,0,0,1,1,1,1,1,1] 粗体数字从 0 翻转到 1,最长的子数组长度为 6。
没思路直接看题解
分析:
先问题转换:滑动窗口解法,right所在位置的前缀中0的个数减去left所在位置前缀和中0的个数小于等于k,如果要right-left+1最大,那么就中间0的个数都等于k,一旦它们之间0的个数多于k,再让left往右赶
class Solution(object):
def longestOnes(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
n = len(nums)
# lnum 窗口左侧位置的前缀0总数
# rnum 窗口右侧位置的前缀0总数
lnum = rnum = left = 0
maxlen = 0
for right in range(n):
rnum += 1 - nums[right]
while lnum < rnum - k:
lnum += 1 - nums[left]
left += 1
maxlen = max(maxlen, right - left + 1)
return maxlen