leetcode 1248. 统计「优美子数组」-medium python解法

题目描述

在这里插入图片描述

思路

  1. 建立数组opp_position用来存储每一个奇数的下标
  2. 描述优美子数组的方式即为:第i个奇数~第i+k-1个奇数的范围。其窗口空间的下界为第i-1个奇数以后上界为第i+k个奇数以前。排列组合即为优美子数组个数
  3. 为保证在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]
  4. 为了让两个虚构的奇数位置不对结果造成影响在第二个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循环的情况。看师傅们的思路还存在前缀下表+差分的解法,之后有时间可以再研究。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值