暴力
class Solution:
def numOfSubarrays(self, arr: List[int], k: int, threshold: int) -> int:
sum=count=0
for i in range(len(arr)-k+1):
r=0
sum=0
for j in range(i,i+k):
sum += arr[j]
r = sum/k
if r>= threshold:
count+=1
return count
结果超时了…
改进后的代码
依然超出了时间限制
class Solution:
def numOfSubarrays(self, arr: List[int], k: int, threshold: int) -> int:
i=0
j=k-1
count=0
while j<=len(arr)-1:
sum=m=r=0
m=i
while m<=j:
sum += arr[m]
m+=1
r = sum/k
if r>= threshold:
count+=1
i+=1
j+=1
return count
滑动窗口
概念
滑动窗口算法可以用以解决数组/字符串的子元素问题
,它可以将嵌套的循环问题,转换为单循环问题,降低时间复杂度。
class Solution(object):
def numOfSubarrays(self, arr, k, threshold):
"""
:type arr: List[int]
:type k: int
:type threshold: int
:rtype: int
"""
if k > len(arr): return 0
subArr_num = 0
subArr_sum = 0
thres = threshold*k #优化阈值比较
for i in range(k): #计算出第一个窗口的值
subArr_sum += arr[i]
if subArr_sum >= thres: subArr_num += 1
for i in range(1, len(arr)-k+1):
subArr_sum = subArr_sum - arr[i-1] + arr[i+k-1] #秒啊
if subArr_sum >= thres:
subArr_num += 1
return subArr_num
其他滑动窗口类的题:
#3
#239
#219
#209
参考
什么是「滑动窗口算法」(sliding window algorithm),有哪些应用场景? - 程序员吴师兄的回答 - 知乎
https://www.zhihu.com/question/314669016/answer/663930108