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;
    }
相关推荐
Yu_Lijing13 小时前
基于C++的《Head First设计模式》笔记——访问者模式
c++·笔记·设计模式
计算机安禾13 小时前
【数据结构与算法】第20篇:二叉树的链式存储与四种遍历(前序、中序、后序、层序)
c语言·开发语言·数据结构·c++·学习·算法·visual studio
顶点多余13 小时前
POSIX信号量+生产消费模型应用+环形缓冲区实现
linux·c++
菜菜的顾清寒13 小时前
力扣HOT100(16)除了自身以外数组的乘积
算法·leetcode·职场和发展
￰meteor13 小时前
【函数指针】
c++
Huangjin007_13 小时前
【C++类和对象(四)】手撕 Date 类:赋值运算符重载 + 日期计算
开发语言·c++
老虎062713 小时前
LeetCode热题100 刷题笔记(第六天)双指针 「 盛最多水的容器」
笔记·算法·leetcode
长不大的小Tom14 小时前
快速学习 C/C++ 并进阶的路线
开发语言·c++
南境十里·墨染春水14 小时前
C++笔记 继承关系中构造和析构顺序(面向对象)
开发语言·c++·笔记
Frostnova丶14 小时前
LeetCode 735 & 2751.栈模拟碰撞问题详解
算法·leetcode