和为k的子数组
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2
提示:
1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107
Related Topics
数组
哈希表
前缀和
暴力解法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { public int subarraySum(int[] nums, int k) { int res=0; for(int i=0;i<nums.length;i++) { int sum=0; for(int end=i;end>=0;end--){ sum+=nums[end]; if(sum==k) res++; } } return res; } }
|
前缀和解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public int subarraySum(int[] nums, int k) { int len=nums.length; int []presum=new int[len+1]; presum[0]=0; for(int i=0;i<len;i++){ presum[i+1]=presum[i]+nums[i]; } int res=0; for(int left=0;left<len;left++){ for(int right=left;right<len;right++){ if(presum[right+1]-presum[left]==k){ res++; } } } return res;
} }
|
前缀和 + 哈希表优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import java.util.HashMap;
class Solution { public int subarraySum(int[] nums, int k) { Map<Integer,Integer>map=new HashMap<>(); map.put(0,1); int presum=0; int res=0; for(int i=0;i<nums.length;i++){ presum+=nums[i]; if(map.containsKey(presum-k)){ res+=map.get(presum-k); } map.put(presum,map.getOrDefault(presum,0)+1);
} return res;
} }
|
同类问题有:
- 「力扣」第 1 题:两数之和
- 「力扣」第 1248 题: 统计「优美子数组」
- 「力扣」第 454 题:四数相加 II
可以用这些题来练习一下