本文共 1054 字,大约阅读时间需要 3 分钟。
为了求解所有长奇数的子数组的和的总和,我们可以采用前缀和数组加双层循环的方法。这种方法虽然时间复杂度为O(n²),但对于大多数情况来说是有效且易于实现的。
计算前缀和数组:
preSum
,其中preSum[i]
表示数组A
的前i
个元素的和。通过遍历数组,逐个计算每个元素与前一个前缀和的和,得到前缀和数组。遍历所有奇数长度的子数组:
累加子数组的和:
public class Solution { public int sumOddLengthSubarrays(int[] arr) { int[] preSum = new int[arr.length + 1]; for (int i = 0; i < arr.length; i++) { preSum[i + 1] = preSum[i] + arr[i]; } int res = 0; for (int i = 1; i <= arr.length; i += 2) { for (int j = 0; j + i - 1 < arr.length; j++) { res += preSum[j + i] - preSum[j]; } } return res; }}
前缀和数组计算:
preSum
数组,长度为arr.length + 1
。arr
,计算每个preSum[i+1]
为preSum[i]
加上arr[i]
的值。双层循环遍历子数组:
i
,从1开始,每次增加2。j
,确保子数组的长度为i
,并计算其和。累加子数组和:
preSum[j + i] - preSum[j]
,并累加到结果res
中。这种方法通过预先计算前缀和,使得每个子数组的和计算过程变得高效,从而优化了整体的时间复杂度。尽管时间复杂度为O(n²),但该方法在实际应用中表现良好,尤其是当数组长度适中时。
转载地址:http://ubjs.baihongyu.com/