leetcode刷题记录(五十四)——560. 和为 K 的子数组

news2025/1/16 6:04:51

(一)问题描述

560. 和为 K 的子数组 - 力扣(LeetCode)560. 和为 K 的子数组 - 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。子数组是数组中元素的连续非空序列。 示例 1:输入:nums = [1,1,1], k = 2输出:2示例 2:输入:nums = [1,2,3], k = 3输出:2 提示: * 1 <= nums.length <= 2 * 104 * -1000 <= nums[i] <= 1000 * -107 <= k <= 107icon-default.png?t=O83Ahttps://leetcode.cn/problems/subarray-sum-equals-k/description/?envType=study-plan-v2&envId=top-100-liked

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 

子数组是数组中元素的连续非空序列。

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 2 * 104
  • -1000 <= nums[i] <= 1000
  • -107 <= k <= 107

 (二)解决思路

1. 滑动窗口(退化为暴力解)

        求数组或字符串的“连续非空序列”,很容易想到滑动窗口。乍一看和209.长度最小的子数组很像,区别在于这道题中的元素不都是整数(即加的数越多,和反而可能越小),并且要找到满足条件的多个子数组。这里我的思路和3. 无重复字符的最长子串类似:找以各个元素为开头的满足和为k的子数组。但是问题就在于,数组中存在负数,那么以同一个元素开头的满足和为k的子数组就可能有多个,因此窗口右边界需要遍历从左边界开始直至数组结束的每一个元素。此时该方法也就退化成了暴力解法。

public class Solution {
    public int subarraySum(int[] nums, int k) {
        int count = 0;
        for (int left = 0; left < nums.length; ++left) {
            int sum = 0;
            for (int right = left; right < nums.length;++right) {
                sum += nums[right];
                if (sum == k) {
                    count++;
                }
            }
        }
        return count;
    }
}

2. 前缀和+哈希表

        我们定义 pre[i] 为 [0..i] 里所有数的和(即元素i的前缀和),则 pre[i] 可以由 pre[i−1] 递推而来,即:

                                                        pre[i]=pre[i−1]+nums[i]

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

                                                        pre[i]−pre[j−1]==k
        简单移项可得符合条件的下标 j 需要满足

                                                        pre[j−1]==pre[i]−k
        所以我们考虑以 i 结尾的和为 k 的连续子数组个数时只要统计有多少个前缀和为 pre[i]−k 的 pre[j] 即可。建立哈希表 map,以和为键,出现次数为对应的值,记录 pre[i] 出现的次数,从左往右边更新 mp 边计算答案。

public class Solution {
    public int subarraySum(int[] nums, int k) {

        int count=0,pre=0;

        HashMap<Integer,Integer> map = new HashMap<>();

        //初始状态0,1
        map.put(0,1);

        for(int i=0;i<nums.length;i++){

           //计算当前元素前缀和
           pre+=nums[i];

           //如果存在前缀和等于pre-k的元素,计数+1
           if(map.containsKey(pre-k)){
                count+=map.get(pre-k);
           } 

           //将当前元素的前缀和放进map中
           //如果map已有当前元素的前缀和,那么在原有值的基础上加一
           //如果map没有当前元素的前缀和,那么将其加入到map中,记出现次数为1
           map.put(pre,map.getOrDefault(pre,0)+1);
        }
        return count;
    }
}

 小细节

(1)为什么要加入初始状态key=0,value=1。在进行判断时,是看在当前元素i之前,有没有出现过某一个或多个元素j,它的前缀和pre[j]=pre[i]-1。那么对于第一个元素,它之前没有其他元素,相当于该元素之前的元素前缀和为0。如果这里没有添加过前缀和为0的初始状态,将无法处理第一个元素的值恰好等于k的情况

(2)为什么 将当前前缀和放入map 要放在判断 是否有前缀和等于pre-k 之后。我们认为元素i是这个连续子序列的末尾元素,可以当成是我要判断把末尾元素i加进来之后,整个连续子序列的和会不会等于k。考虑的是元素i的前缀和和它之前[0...i-1]个元素的前缀和的关系,如果先把pre[i]加进来再做判断,元素i就被重复考虑了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2277394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软考,质量管理。

项目质量管理&#xff0c;PMBOOK 质量是满足需求的能力的特性的总结 需求的满足程度 质量通常是指产品的质量&#xff0c;广义上的质量还包括工作质量。产品质量是指产品的使用价值及其属性&#xff1b;而工作质量则是产品质量的保证&#xff0c;它反映了与产品质量直接有关的…

Re78 读论文:GPT-4 Technical Report

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名&#xff1a;GPT-4 Technical Report 官方博客&#xff1a;GPT-4 | OpenAI appendix懒得看了。 文章目录 1. 模型训练过程心得2. scaling law3. 实验结果减少风险 1. 模型训练过程心得 模型结构还…

LeetCode | 图文详细描述动态规划DP算法及经典题型

本文将用简单直白的方式&#xff0c;从零开始带你掌握动态规划的精髓。你会发现&#xff1a; 动态规划其实没那么难——它就是递归的“记性”版。状态转移方程不再玄学——从题目思路到实现&#xff0c;手把手教你推导。经典题型剖析——从“爬楼梯”到“背包问题”&#xff0…

学习threejs,使用RollControls相机控制器

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.RollControls 相机控…

期权懂|场内期权合约行权价格是如何设定制度的?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 场内期权合约行权价格是如何设定制度的&#xff1f; 场内期权合约的行权价格是期权合约中的一个关键要素&#xff0c;它决定了期权买方在期权到期日或之前买入&#xff08;对于…

设计模式相关面试

设计模式 工厂方法模式 简单工程模式 工厂方法设计模式 抽象工厂设计模式 工厂方法小结 策略模式 案例&#xff08;工厂模式策略模式&#xff09; 责任链设计模式 概述 常见使用方式 常见技术场景 单点登录如何实现 权限认证如何实现 上传数据的安全如何控制 遇到了那些比较棘…

C#轻松实现ModbusTCP服务器接口

大家好&#xff01;我是付工。 通透&#xff01;终于把ModbusRTU弄明白了 这样看来&#xff0c;ModbusTCP协议太简单了 太简单了&#xff01;C#轻松实现Modbus通信 前面给大家介绍了一系列关于Modbus和ModbusTCP的知识&#xff0c;主要针对的是ModbusTCP客户端。 在实际开…

比较之舞,优雅演绎排序算法的智美篇章

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一、冒泡排序&#xff1a;数据海…

mysql-5.7.18保姆级详细安装教程

本文主要讲解如何安装mysql-5.7.18数据库&#xff1a; 将绿色版安装包mysql-5.7.18-winx64解压后目录中内容如下图&#xff0c;该例是安装在D盘根目录。 在mysql安装目录中新建my.ini文件&#xff0c;文件内容及各配置项内容如下图&#xff0c;需要先将配置项【skip-grant-tab…

2025年华数杯国际赛B题论文首发+代码开源 数据分享+代码运行教学

176项指标数据库 任意组合 千种组合方式 14页纯图 无水印可视化 63页无附录正文 3万字 1、为了方便大家阅读&#xff0c;全文使用中文进行描述&#xff0c;最终版本需自行翻译为英文。 2、文中图形、结论文字描述均为ai写作&#xff0c;可自行将自己的结果发给ai&#xff0c…

unity学习17:unity里的旋转学习,欧拉角,四元数等

目录 1 三维空间里的旋转与欧拉角&#xff0c;四元数 1.1 欧拉角比较符合直观 1.2 四元数 1.3 下面是欧拉角和四元数的一些参考文章 2 关于旋转的这些知识点 2.1 使用euler欧拉角旋转 2.2 使用quaternion四元数,w,x,y,z 2.3 使用quaternion四元数,类 Vector3.zero 这种…

深度剖析RabbitMQ:从基础组件到管理页面详解

文章目录 一、简介二、Overview2.1 Overview->Totals2.2 Overview->Nodesbroker的属性2.3 Overview->Churn statistics2.4 Overview->Ports and contexts2.5 Overview->Export definitions2.6 Overview->Import definitions 三、Connections连接的属性 四、C…

机器学习中的凸函数和梯度下降法

一、凸函数 在机器学习中&#xff0c;凸函数 和 凸优化 是优化问题中的重要概念&#xff0c;许多机器学习算法的目标是优化一个凸函数。这些概念的核心思想围绕着优化问题的简化和求解效率。下面从简单直观的角度来解释。 1. 什么是凸函数&#xff1f; 数学定义 一个函数 f…

使用 WPF 和 C# 绘制覆盖网格的 3D 表面

此示例展示了如何使用 C# 代码和 XAML 绘制覆盖有网格的 3D 表面。示例使用 WPF 和 C# 将纹理应用于三角形展示了如何将纹理应用于三角形。此示例只是使用该技术将包含大网格的位图应用于表面。 在类级别&#xff0c;程序使用以下代码来定义将点的 X 和 Z 坐标映射到 0.0 - 1.…

深入Android架构(从线程到AIDL)_32 JNI架构原理_Java与C的对接05

1、EIT造形观点 基于熟悉的EIT造形&#xff0c;很容易理解重要的架构设计决策议题。 前言 2、混合式EIT造形 一般EIT造形是同语言的。也就是<E>、 <I>和<T>都使用同一种语言撰写的&#xff0c;例如上述的Java、 C/C等。于此&#xff0c;将介绍一个EIT造…

数字普惠金融对新质生产力的影响研究(2015-2023年)

基于2015—2023年中国制造业上市公司数据&#xff0c;探讨了数字普惠金融对制造业企业新质生产力的影响及作用机理。研究发现&#xff0c;数字普惠金融有助于促进制造业企业新质生产力的发展&#xff0c;尤其是在数字普惠金融的使用深度较大的情况下&#xff0c;其对新质生产力…

装备制造业:建立项目“四算”管理:以合同为源头,以项目为手段实现合同的测算、预算、核算与决算的管控体系

尊敬的各位管理层&#xff1a; 大家好&#xff01;作为装备制造业的 CFO&#xff0c;我今天要向大家汇报的是如何建立项目“四算”管理&#xff0c;即以合同为源头&#xff0c;以项目为手段实现合同的测算、预算、核算与决算的管控体系。在当前市场竞争激烈、成本压力不断增大…

自建RustDesk服务器

RustDesk服务端 下面的截图是我本地的一个服务器做为演示用&#xff0c;你自行的搭建服务需要该服务器有固定的ip地址 1、通过宝塔面板快速安装 2、点击【安装】后会有一个配置信息&#xff0c;默认即可 3、点击【确认】后会自动安装等待安装完成 4、安装完成后点击【打开…

前端实现doc文件预览的三种方式

文章目录 1、docx-preview 实现&#xff08;推荐&#xff09;2、vue-office 实现3、mammoth 实现&#xff08;不推荐&#xff09; 需求&#xff1a;有一个docx文件&#xff0c;需要按其本身的格式&#xff0c;将内容展示出来&#xff0c;即&#xff1a;实现doc文件预览。 本文…

final修饰的用法

1、final修饰类 被final修饰的类不可以在被继承。 比如在Java中String就是final修饰的不可以被继承 2、final修饰成员变量 同时final也可以修饰局部变量 final int N5; 3、final修饰静态变量 final修饰静态的成员变量&#xff0c;&#xff08;在方法中不能定义静态的属性…