leetcode-560:和为 K 的子数组

简介: leetcode-560:和为 K 的子数组

题目

题目连接

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。

示例 1:

输入:nums = [1,1,1], k = 2
输出:2

示例 2:

输入:nums = [1,2,3], k = 3
输出:2

解题

方法一:前缀和(超时)

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int n=nums.size();
        vector<int> preSums(n+1);
        for(int i=0;i<nums.size();i++){
            preSums[i+1]=preSums[i]+nums[i];
        }
        int count=0;
        for(int i=1;i<=n;i++){
            for(int j=0;j<i;j++){
                if(preSums[i]-preSums[j]==k){
                    count++;
                }
            }
        }
        return count;
    }
};

方法二:前缀和+哈希表

红色部分就是我们要求的和为k的子数组

如果当前遍历到的前缀和是presum,那么只要知道presum-k的个数就行了,对最后结果加上presum-k的个数

通过map去维护一个前缀和 的个数

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int,int> map;
        map[0]=1;//前缀和为0的个数为1
        int preSum=0;
        int count=0;
        for(int num:nums){
            preSum+=num;
            if(map.count(preSum-k)){//加上前缀和为preSum-k的个数
                count+=map[preSum-k];
            }
            map[preSum]++;
        }
        return count;
    }
};
相关文章
|
1月前
|
存储 算法
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
|
1月前
|
Go
golang力扣leetcode 713.乘积小于K的子数组
golang力扣leetcode 713.乘积小于K的子数组
24 0
|
11天前
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
|
1月前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
18 0
|
1月前
【力扣】209. 长度最小的子数组
【力扣】209. 长度最小的子数组
|
1月前
leetcode代码记录(长度最小的子数组
leetcode代码记录(长度最小的子数组
20 0
|
1月前
|
算法 测试技术
每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)
每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)
|
1月前
|
算法 测试技术 C#
【单调栈】LeetCode2334:元素值大于变化阈值的子数组
【单调栈】LeetCode2334:元素值大于变化阈值的子数组
【单调栈】LeetCode2334:元素值大于变化阈值的子数组
|
1月前
|
算法
LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数
LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数
34 0
|
1月前
代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组
代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组
47 0