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

Leetcode560. 和为 K 的子数组

Leetcode560. 和为 K 的子数组

题目:
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 。

示例 1:

输入:nums = [1,1,1], k = 2
输出:2

示例 2:

输入:nums = [1,2,3], k = 3
输出:2

题解:
前缀和 + 哈希表
我们定义 pre [ i ] \textit{pre}[i] pre[i] [ 0.. i ] [0..i] [0..i] 里所有数的和,则 pre [ i ] \textit{pre}[i] pre[i] 可以由 pre [ i − 1 ] \textit{pre}[i-1] pre[i1] 递推而来,即:

pre [ i ] = pre [ i − 1 ] + nums [ i ] \textit{pre}[i]=\textit{pre}[i-1]+\textit{nums}[i] pre[i]=pre[i1]+nums[i]

那么【 [ j . . i ] [j..i] [j..i] 这个子数组和为 k k k 】这个条件我们可以转化为

pre [ i ] − pre [ j − 1 ] = = k \textit{pre}[i]-\textit{pre}[j-1]==k pre[i]pre[j1]==k

简单移项可得符合条件的下标 j j j 需要满足

pre [ j − 1 ] = = pre [ i ] − k \textit{pre}[j-1] == \textit{pre}[i] - k pre[j1]==pre[i]k

所以我们考虑以 i i i 结尾的和为 k k k 的连续子数组个数时只要统计有多少个前缀和为 pre [ i ] − k \textit{pre}[i]-k pre[i]k pre [ j ] \textit{pre}[j] pre[j] 即可。我们建立哈希表 mp \textit{mp} mp,以和为键,出现次数为对应的 pre [ j ] \textit{pre}[j] pre[j]的下标范围是 0 ≤ j ≤ i 0\leq j\leq i 0ji 。同时,由于 pre [ i ] \textit{pre}[i] pre[i]的计算只与前一项的答案有关,因此我们可以不用建立 pre \textit{pre} pre 数组,直接用 pre \textit{pre} pre 变量来记录 p r e [ i − 1 ] pre[i-1] pre[i1] 的答案即可。

java代码:

  /**
     * @param nums
     * @param k
     * @return
     */
    public static int subarraySum(int[] nums, int k) {
        int count = 0, pre = 0;
        HashMap<Integer, Integer> map = new HashMap<>();
        map.put(0, 1);
        for (int i = 0; i < nums.length; i++) {
            pre += nums[i];

            if (map.containsKey(pre - k)) {
                count += map.get(pre - k);
            }
            map.put(pre, map.getOrDefault(pre, 0) + 1);
        }
        return count;
    }

相关文章:

  • Docker部署Tomcat
  • NFT交易量下滑 传统品牌布局热情未衰
  • 2022下半年各省软考报名费用汇总,不知道的看这里
  • 社交网络的数据挖掘与分析,什么是社交网络分析
  • Allegro DVT与SiMa.ai携手优化嵌入式边缘应用的能效
  • 2022-8-30 第七小组 学习日记 (day54)JavaWeb、Servlet、HTTP-请求 响应、乱码问题
  • U9二次开发之BE插件开发
  • 推荐系统-Hive基础
  • 通信原理 | 基本概念:信源、信道、噪声、信宿等
  • 关于Flask高级_RequestParser中的add_argument方法参数详解
  • flume系列之:基于zookeeper部署flume agent升级guava和curator版本
  • 触摸控件——滑动调节
  • NetApp与VMware和AWS合作,帮助客户实现云端企业工作负载的现代化和扩展
  • 快来了解一下5个超实用的WPS表格操作技巧!
  • 触摸控件——增量调节
  • [译] 怎样写一个基础的编译器
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 10个确保微服务与容器安全的最佳实践
  • Angular6错误 Service: No provider for Renderer2
  • CentOS从零开始部署Nodejs项目
  • Django 博客开发教程 16 - 统计文章阅读量
  • django开发-定时任务的使用
  • in typeof instanceof ===这些运算符有什么作用
  • Shadow DOM 内部构造及如何构建独立组件
  • SpringBoot 实战 (三) | 配置文件详解
  • Swift 中的尾递归和蹦床
  • vue自定义指令实现v-tap插件
  • 闭包--闭包作用之保存(一)
  • 关于extract.autodesk.io的一些说明
  • 爬虫模拟登陆 SegmentFault
  • 如何优雅地使用 Sublime Text
  • 设计模式 开闭原则
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 项目实战-Api的解决方案
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (06)金属布线——为半导体注入生命的连接
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Note)C++中的继承方式
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (力扣)1314.矩阵区域和
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (算法)N皇后问题
  • (算法二)滑动窗口
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Micro Framework初体验
  • .net 生成二级域名
  • .net(C#)中String.Format如何使用