前缀和 & 所有奇数长度子数组的和

183 阅读2分钟

前言

“这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

  1. 1588. 所有奇数长度子数组的和

  2. 1480. 一维数组的动态和

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

给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。

子数组 定义为原数组中的一个连续子序列。

请你返回 arr 中 所有奇数长度子数组的和 。

示例 1:

输入:arr = [1,4,2,5,3]

输出:58

解释:所有奇数长度子数组和它们的和为:
[1] = 1
[4] = 4
[2] = 2
[5] = 5
[3] = 3
[1,4,2] = 7
[4,2,5] = 11
[2,5,3] = 10
[1,4,2,5,3] = 15
我们将所有值求和得到 1 + 4 + 2 + 5 + 3 + 7 + 11 + 10 + 15 = 58

思路分析:

利用前缀和 统计子数组的和, 遍历子数组可能的奇数长度 1 - x (x <= len) 然后根据子数组的长度, 找到所有长度符合的子数组,然后将符合条件的子数组和加到一起,最后返回即可

AC 代码:

public int sumOddLengthSubarrays(int[] arr) {
    if (arr == null || arr.length == 0) return 0;

    int len = arr.length;

    int[] dp = new int[len + 1];

    for (int i = 1; i <= len; i++) dp[i] = arr[i - 1] + dp[i - 1];

    int ans = 0;

    for (int i = 1; i <= len; i += 2) {

        for (int j = 0; j + i <= len; j++) {

            ans += dp[j + i] - dp[j];
        }
    }

    return ans;
}

1480. 一维数组的动态和

给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。

请返回 nums 的动态和。

示例 1:

输入:nums = [1,2,3,4]

输出:[1,3,6,10]

解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4]

思路分析:

一维前缀和模拟问题, 按题目要求实现即可

AC代码:

public int[] runningSum(int[] nums) {
    int len = nums.length;
    for(int i=1;i<len;i++){
        nums[i] += nums[i - 1];
    }
    return nums;
}