前缀和-560.和为k的子数组-力扣(LeetCode)

一、题目解析

1.子数组是数组中元素的连续非空序列

2.nums[i]范围为[-1000,1000],存在负数

3.由于2的题目条件,该题不能用双指针算法,不具备单调性

二、算法原理

解法1:暴力解法->枚举 O(N^2)

固定一个值,向后枚举数组和,遇到sum == k仍需继续枚举,因为后面同样有可能出现sum == k的情况

解法2:前缀和+哈希表

用哈希表unordered_map<int,int> hash,统计前缀和出现的频率

细节问题:

1.前缀和加入哈希表的时机?

在判断hash表中是否存在sum[i]-k后加入哈希表,即在下一个位置计算前缀和时,哈希表内存储的是上次的前缀和,也就是[0,i-1]区间的前缀和

2.不用真的创建一个前缀和数组,使用变量sum标记前一个位置的前缀和

3.如果整个前缀和等于k呢?

即在hash中,hash[0]=1

三、代码示例

cpp 复制代码
class Solution {
public:
    int subarraySum(vector<int>& nums, int k)
    {
        unordered_map<int,int> hash;
        hash[0] = 1;
        int sum = 0,ret = 0;
        for(auto e : nums)
        {
            sum += e;
            if(hash.count(sum - k)) ret += hash[sum - k];
            hash[sum]++;
        }
        return ret;
    }
};

看到最后,如果对您有所帮助,还请点赞、收藏和关注,我们下期再见!

相关推荐
晨非辰1 小时前
《剑指Offer:单链表操作入门——从“头删”开始破解面试》
c语言·开发语言·数据结构·c++·笔记·算法·面试
渡我白衣5 小时前
list 与 forward_list:一场 STL 中的“链表哲学”之争
数据结构·c++·list
CoderYanger8 小时前
优选算法-双指针:2.复写零
java·后端·算法·leetcode·职场和发展
charlie1145141918 小时前
理解C++20的革命特性——协程支持2:编写简单的协程调度器
c++·学习·算法·设计模式·c++20·协程·调度器
liulilittle11 小时前
网络编程基础算法剖析:从字节序转换到CIDR掩码计算
开发语言·网络·c++·算法·通信
刀客12312 小时前
C++ 面试总结
开发语言·c++·面试
greentea_201312 小时前
Codeforces Round 65 B. Progress Bar(71)
c++·算法
序属秋秋秋12 小时前
《C++进阶之C++11》【智能指针】(下)
c++·笔记·学习·面试·c++11·智能指针·新特性
Mr.Ja12 小时前
【LeetCode热题100】No.1——两数之和(Java)
java·算法·leetcode
Mingze031412 小时前
考研408之栈与队列学习
开发语言·c++·学习·考研·算法