python-leetcode-1588. 所有奇数长度子数组的和

1588. 所有奇数长度子数组的和 - 力扣(LeetCode)

问题解析:

要找出数组 arr 中所有奇数长度连续子数组,并计算它们的和,最后返回所有这些和的总和。

示例:

比如 arr = [1, 4, 2, 5, 3],所有奇数长度的子数组包括:

  • 长度为 1:[1], [4], [2], [5], [3]

  • 长度为 3:[1,4,2], [4,2,5], [2,5,3]

  • 长度为 5:[1,4,2,5,3]

将这些子数组的和加起来就是我们要的答案。


方法一:暴力解法(适合小数组)

我们可以遍历所有可能的子数组,并检查其长度是否为奇数。

def sumOddLengthSubarrays(arr):
    n = len(arr)
    total = 0
    for start in range(n):
        for end in range(start, n):
            length = end - start + 1
            if length % 2 == 1:  # 如果是奇数长度
                total += sum(arr[start:end+1])
    return total

方法二:优化方法(数学方法)

我们可以计算每个元素在所有奇数长度子数组中出现的次数,然后用该次数乘以元素值,加总即是答案。

def sumOddLengthSubarrays(arr):
    n = len(arr)
    total = 0
    for i, val in enumerate(arr):
        left = i + 1
        right = n - i
        total_subarrays = left * right
        odd_count = (total_subarrays + 1) // 2  # 只统计奇数长度的出现次数
        total += val * odd_count
    return total
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值