题目描述
思路
- 建立数组opp_position用来存储每一个奇数的下标
- 描述优美子数组的方式即为:
第i个奇数~第i+k-1个奇数
的范围。其窗口空间的下界为第i-1个奇数以后上界为第i+k个奇数以前。排列组合即为优美子数组个数 - 为保证在
nums[0]
位置的奇数与在nums[len(nums)]
即末尾位置的奇数能够套入到ans+=(opp_position[i]-opp_position[i-1])*(opp_position[i+k]-opp_position[i+k-1])
表达式当中,在opp_position[]
的起始值增加了一个[0]位,而真正nums[0]
位的数标记成了[0+1]
位。而在末尾位置也填入了一个[n+1]
。 - 为了让两个虚构的奇数位置不对结果造成影响在第二个for循环中,起始下标设为了
1
,避开了统计虚构的[0]
位置,终值设为n-k(即不含有n-k)
,避开了末尾位置的值可能造成的影响也保证了算法不越界。
python代码
class Solution:
def numberOfSubarrays(self, nums, k):
ans=0
opp_position=[0]#增加0位置奇数
for i in range (len(nums)):#通过len()函数获取nums数组长度
if(nums[i] % 2 == 1):#取奇数操作
opp_position.append(i+1)#在这里把[0]位置的奇数记为了[1]
opp_position.append(len(nums)+1)#增加末位值标记
n=len(opp_position)
for i in range (1,n-k):#从[1]位置开始,就去除了增长在开头位置的[0]但保证了表达式的完整,终值为n-k去除了在末尾增长的标记
ans+=(opp_position[i]-opp_position[i-1])*(opp_position[i+k]-opp_position[i+k-1])
#优美子数组的个数为第i个奇数到第i-1个奇数间的元素数和第i+k个奇数与i+k-1这个奇数之间窗口能产生的最大数量。
return ans
运行效率:
优化思考:
这个使用的是官方的数学方法,使用了滑动窗口的解法。但是使用了两个for循环,时间复杂度相对就会高一点,可以尝试着把它改成单个for循环的情况。看师傅们的思路还存在前缀下表+差分的解法,之后有时间可以再研究。