当前位置: 首页 > article >正文

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只能存储当前位置之前的累加和,所以一举两得,只用一次遍历即可解决。

	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;
    }

http://www.kler.cn/a/305476.html

相关文章:

  • 从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化20241112
  • 使用HTML、CSS和JavaScript创建动态圣诞树
  • Elasticsearch(ES)简介
  • Apache ECharts
  • wordpress搭建主题可配置json
  • 通过脚本,发起分支合并请求和打tag
  • pptp解说
  • vb.net发送邮件:如何高效地实现邮件发送?
  • 【鸿蒙】HarmonyOS NEXT星河入门到实战4-ArkTS界面布局深入
  • 什么品牌的宠物空气净化器性价比最高?352/希喂/霍尼韦尔/有哈/IAM实测对比
  • Oracle(125)如何执行不完全恢复?
  • Netty笔记07-粘包与半包(上)
  • 新能源汽车出海中的数据合规热点问题
  • 系统分析师--系统可靠性分析与设计
  • Rust编写Windows服务
  • 从“天宫课堂”到人工智能:中国少儿编程的未来在哪里?
  • golang学习笔记12——Go 语言内存管理详解
  • 软件测试工程师面试整理-数据库与SQL
  • 微信小程序使用 ==== 粘性布局
  • Ubuntu 常用指令和作用解析
  • 16. MyBatis的延迟加载机制是什么?如何配置?有哪些优缺点?
  • 股票程序化交易赚钱吗,证监会如何监测股票多账户关联交易
  • Vue 创建自定义指令 以及创建自定义指令相关属性说明
  • DFS 算法:洛谷B3625迷宫寻路
  • Redis相关命令详解
  • Understanding the model of openAI 5 (1024 unit LSTM reinforcement learning)