前言
“这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战”
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;
}