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;
    }
相关推荐
文丑颜不良啊5 小时前
LeetCode876~900题目解析
java·leetcode
choumin7 小时前
C++中万能引用与std::forward的作用和用法
c++·万能引用·std forward
下一站春风里8 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
努力努力再努力wz10 小时前
【C++高阶系列】C++20 协程底层原理:函数为什么能暂停?从状态机到 Task,彻底串起挂起、恢复与协程调度
开发语言·c++·c++20·1024程序员节
划破黑暗的第一缕曙光11 小时前
[C++]:4.模板
c++·template·模板·函数模版·类模版
十五年专注C++开发11 小时前
pybind11:一个跨C++和Python平台的编程库
开发语言·c++·python·pybind11
CodeYp201911 小时前
第11讲:stack 和 queue
开发语言·c++·queue·stack
沫璃染墨11 小时前
《Qt从零入门系列(十五):Qt线程安全与锁机制详解——从QMutex到RAII与读写锁实战》
开发语言·c++·qt·安全·交互·线程·qt6.3
hetao173383711 小时前
2026-10-25 hetao1733837 的刷题记录
c++·算法
fqbqrr12 小时前
2610C++,UI复合技术在窗口中绘画字体图标
c++·ui