版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Apple_hzc/article/details/83346611
一、Description
Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum equals to k.
题目大意:给定一个数组和一个k,找出数组中所有连续元素的和等于k的组合数。
Example 1:
Input:nums = [1,1,1], k = 2 Output: 2
二、Analyzation
在这里介绍时间复杂度和空间复杂度最优化的方法。定义一个hashmap,其中key放的是从0到当前索引所有元素的和sum,value是对应的sum所出现的次数,为什么要这么做呢?
假设当前遍历到的数组下标为j,则:
sum[0...j] - sum[0...x] = sum[x + 1...j];//其中k = sum[x + 1...j]
我们从0开始遍历数组,不断累加sum,并检查map中是否包含值为sum - k的key,如果包含,说明在这之前一定存在一个连续的子序列的值等于k,这时count加一,并将当前的sum放入map中(如果已存在则更新value加一),最后返回count即为所求。
三、Accepted code
class Solution {
public int subarraySum(int[] nums, int k) {
if (nums == null || nums.length == 0) {
return 0;
}
int sum = 0, count = 0;
Map<Integer, Integer> map = new HashMap<>();
map.put(0, 1);
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
if (map.containsKey(sum - k)) {
count += map.get(sum - k);
}
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
return count;
}
}