560 和为k的子数组

解题思路:
\qquad 一开始看到连续非空序列,会想到是不是可以用双指针表示一个区间,然后通过一次遍历找出所有可能的区间,但看到元素的取值区间就知道行不通,这个方法仅适用于数组元素大于等于0的情况。若数字是负数,随着区间长度的增加,其和的值不一定会增加,因而只能把所有的区间遍历一遍去找。

\qquad 巧妙的解法在于转化,将连续序列的和,转化成两个序列和的值之差(感觉有点dp的影子)。

\qquad 对于每个位置i,记录[0, i]区间内所有元素的和,因此sum[j+1,i] = sum[0,i] - sum[0,j]。这样,题目从一个区间问题,变成了一个a - b = k这种类似两数之和的问题了,妙啊。这些元素之和以及个数可以通过map记录,实现 O ( 1 ) O(1) O(1)查找。而且由于j < i,而在一次遍历过程中,map只能存储当前位置之前的累加和,所以一举两得,只用一次遍历即可解决。

cpp 复制代码
	int subarraySum(vector<int>& nums, int k) {
        int ans = 0, pre = 0;
        unordered_map<int,int> m;
        m[0] = 1;

        for(auto n : nums)
        {
            pre += n;
            if(m.find(pre - k) != m.end())
            {
                ans += m[pre - k];
            }
            m[pre]++;
        }

        return ans;
    }
相关推荐
Darkwanderor几秒前
图论——最短路问题
c++·算法·图论·最短路
小小unicorn2 分钟前
[微服务即时通讯系统]语音子服务的实现与测试
c++·算法·微服务·云原生·架构·xcode
小白学大数据9 分钟前
Pycharm 断点调试 Scrapy:两种实现方式总结
c++·爬虫·scrapy·pycharm
林鸿群12 分钟前
VS2026 + C++ 游戏服务器集群编译部署实战(14 个组件完整流程)
服务器·c++·游戏·mfc·游戏服务器·vs2026·编译部署
漫随流水15 分钟前
备战蓝桥杯(3)
数据结构·c++·算法·蓝桥杯
xsyaaaan21 分钟前
leetcode-hot100-哈希表:1两数之和-49字母异位词分组-128最长连续序列
算法·leetcode·散列表
小此方21 分钟前
Re:从零开始的 C++ 进阶篇(二)C++继承到底做了什么?从对象模型到底层内存布局彻底讲透
c语言·开发语言·c++
zmzb010322 分钟前
C++课后习题训练记录Day114
开发语言·c++
柏木乃一22 分钟前
Linux线程(2)线程的优点和缺点/线程异常/posix线程库原理
linux·运维·服务器·c++·线程·posix
小卓(friendhan2005)32 分钟前
Boost搜索引擎项目【C++】
c++·搜索引擎