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;
    }
};
相关文章
|
6月前
|
存储 算法
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
|
3月前
|
算法 Python
【Leetcode刷题Python】子数组查找
一个用于寻找给定字符串中最长重复子串的Python函数实现,采用了滑动窗口的方法来检测重复的子串。
20 1
|
3月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
40 0
|
5月前
|
算法 测试技术 程序员
力扣经典150题第三十题:长度最小的子数组
力扣经典150题第三十题:长度最小的子数组
28 1
|
4月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
技术经验解读:【LeetCode】560.SubarraySumEqualsK子数组和为K
技术经验解读:【LeetCode】560.SubarraySumEqualsK子数组和为K
|
5月前
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
|
6月前
【力扣】209. 长度最小的子数组
【力扣】209. 长度最小的子数组
|
6月前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
38 0
|
6月前
|
算法 测试技术
每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)
每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)