Given an array of integers nums and an integer k, return the total number of continuous subarrays whose sum equals to k.
Example 1:
Input: nums = [1,1,1], k = 2
Output: 2
Example 2:
Input: nums = [1,2,3], k = 3
Output: 2
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subarray-sum-equals-k
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
暴力破解法,把nums数组各个数字表示为他和前面的累加和,nums[i] - nums[j]为k,那么次数加一。
class Solution {
public int subarraySum(int[] nums, int k) {
for (int i = 1; i < nums.length; i++) {
nums[i] += nums[i - 1];
}
int ans = 0;
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0) {
if (nums[i] == k) {
ans++;
}
} else {
if (nums[i] - nums[j - 1] == k) {
ans++;
}
}
}
}
return ans;
}
}
方法二,用map记录,数组累计的时候中,记录和是sum出现的次数。遍历到map.get(sum - k)的次数,那么久肯定存在有过解。累加起来。
class Solution {
public int subarraySum(int[] nums, int k) {
// 出现sums的总和为k的情况,所以put(0,1);
Map<Integer, Integer> map = new HashMap<Integer, Integer>(){
{
put(0,1);
}
};
int sum = 0;
int ans = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
if (map.containsKey(sum - k)) {
// sum - k的次数
ans += map.get(sum - k);
}
if (!map.containsKey(sum)){
map.put(sum, 0);
}
map.put(sum, map.get(sum) + 1);
}
return ans;
}
}