1. 描述
有一个数组numsnums,以及三个正整数k,u,lk,u,l。
对于numsnums的所有长为kk的子段,如果它的总和小于uu,就得11分,如果它的总和大于ll,就扣11分。
请求出最终能获得多少分?
2. 样例
样例输入:
nums = [0, 1, 2, 3, 4]
k = 2
u = 2
l = 5
样例输出:
0
3. 代码
本题如果使用两层循环,会在测试用例中报超时无法通过。考虑使用两个循环,但仅用一层循环完成。
class Solution:
"""
@param nums: the array to be scored.
@param k: the requirement of subarray length.
@param u: if the sum is less than u, get 1 score.
@param l: if the sum is greater than l, lose 1 score.
@return: return the sum of scores for every subarray whose length is k.
"""
def arrayScore(self, nums, k, u, l):
# write your code here.
# score = 0
# for i in range(len(nums)):
# subsum = nums[i]
# count = k-1
# if i+k<=len(nums):
# for j in range(i+1, i+k):
# subsum += nums[j]
# if subsum < u :
# score +=1
# if subsum > l :
# score -=1
# return score
# i = 0
# score = 0
# while i+k<=len(nums):
# subsum = nums[i]
# for index in range(i+1, i+k):
# subsum += nums[index]
# if subsum < u :
# score +=1
# if subsum > l :
# score -=1
# i+=1
# print(i, subsum, score)
# return score
subsum = 0
score = 0
for i in range(k):
subsum += nums[i]
if subsum < u :
score +=1
if subsum > l :
score -=1
for i in range(k, len(nums)):
subsum +=nums[i]
subsum -=nums[i-k]
if subsum < u :
score +=1
if subsum > l :
score -=1
return score