LeetCode 每日一题 1480. 一维数组的动态和

146 阅读1分钟

这是我参与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. 数组的长度为 [1, 20,000]。
  2. 数组中元素的范围是 [-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;
    }
}