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

一、题目解析

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

2.numsi范围为-1000,1000,存在负数

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

二、算法原理

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

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

解法2:前缀和+哈希表

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

细节问题:

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

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

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

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

即在hash中,hash0=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;
    }
};

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

相关推荐
ShineWinsu1 小时前
对于Qt:QTreeWidget常见属性以及QTreeWidgetItem类的解析
开发语言·c++·qt·gui·客户端·多叉树·qtreewidget
落羽的落羽2 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
文丑颜不良啊2 小时前
LeetCode2841~2860题目解析
java·leetcode
文丑颜不良啊4 小时前
LeetCode2921~2940题目解析
java·leetcode
文丑颜不良啊6 小时前
LeetCode2901~2920题目解析
java·leetcode
汉克老师7 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
文丑颜不良啊8 小时前
LeetCode2861~2880题目解析
java·leetcode
晴天的雨.9929 小时前
【C++】继承篇
java·开发语言·c++
青少儿编程课堂9 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven9 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造