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
366

被折叠的 条评论
为什么被折叠?



