这是我参与8月更文挑战的第28天,活动详情查看:8月更文挑战
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] 。
示例 2:
输入: nums = [1,1,1,1,1]
输出: [1,2,3,4,5]
解释: 动态和计算过程为 [1, 1+1, 1+1+1, 1+1+1+1, 1+1+1+1+1] 。
示例 3:
输入: nums = [3,1,2,10,1]
输出: [3,4,6,16,17]
提示:
1 <= nums.length <= 1000
-10^6 <= nums[i] <= 10^6
方法一
前缀和:在求得前面所有元素之和的基础上,再加上当前元素的值;以此递推向后;
class Solution {
public int[] runningSum(int[] nums) {
int[] res = new int[nums.length];
for (int i = 0; i < nums.length; i ++ )
if (i == 0) res[i] = nums[i];
else res[i] = nums[i] + res[i - 1];
return res;
}
}
时间复杂度: O(n)
空间复杂度: O(1)
560. 和为K的子数组
给定一个整数数组和一个整数 k, 你需要找到该数组中和为 k 的连续的子数组的个数。
示例 1 :
输入: nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
说明 :
- 数组的长度为 [1, 20,000]。
- 数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。
方法一
前缀和: 此题基本思路与上面一题基本相似;
首先,遍历一遍数组,求得数组nums
的前缀和;
接着,遍历数组,在遍历的同时维护一个哈希表,该哈希表用于存储在当前元素之前出现过的前缀和及次数;根据sum[i] - sum[j] = k
, 我们可以查看哈希表中是否存在sum[i] - k
,如果有,则说明有连续的数组可以构成k;因为sum[i] - k
可能存在多个,所以要加上哈希表中对应的value值;
class Solution {
public int subarraySum(int[] nums, int k) {
int[] sum = new int[nums.length + 1];
for (int i = 1; i <= nums.length; i ++ )
sum[i] += sum[i - 1] + nums[i - 1];
HashMap<Integer, Integer> map = new HashMap();
map.put(0, 1);
int res = 0;
for (int i = 1; i <= nums.length; i ++ ) {
if (map.getOrDefault(sum[i] - k, 0) != 0)
res += map.get(sum[i] - k);
map.put(sum[i], map.getOrDefault(sum[i], 0) + 1);
}
return res;
}
}