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 <= 107

思路

  1. 前缀和(Prefix Sum)
    前缀和是一个数组处理技巧,用于快速计算数组中任意区间的和。对于数组nums,我们定义prefixSum[i]nums中前i个元素的和,即prefixSum[i] = nums[0] + nums[1] + ... + nums[i-1]。通过前缀和,我们可以快速计算任意区间[i, j]的和,即sum[i, j] = prefixSum[j+1] - prefixSum[i]

  2. 哈希表(HashMap)
    哈希表是一种高效的数据结构,用于存储键值对。在这个问题中,我们使用哈希表来记录前缀和的出现次数。键是前缀和的值,值是该前缀和出现的次数。

  3. 算法步骤

    • 初始化一个哈希表prefixSumCount,用于记录前缀和的出现次数。初始时,我们将0作为键,1作为值放入哈希表,表示前缀和为0的情况已经出现了一次。

    • 初始化一个变量count,用于记录和为k的子数组的个数。

    • 初始化一个变量prefixSum,用于记录当前的前缀和。

    • 遍历数组nums,对于每个元素num,更新prefixSumprefixSum + num

    • 检查prefixSum - k是否在哈希表中。如果在,说明存在一个子数组,其和为k,因为prefixSum - (prefixSum - k) = k。我们将哈希表中prefixSum - k对应的值加到count上。

    • 更新哈希表中当前前缀和prefixSum的出现次数,如果prefixSum已经存在,则将其值加1,如果不存在,则将其值设为1

    • 遍历结束后,count即为和为k的子数组的个数。

  4. 时间复杂度
    该算法的时间复杂度为O(n),其中n是数组nums的长度。这是因为我们只对数组进行了一次遍历,并且在哈希表中的操作都是常数时间的。

  5. 空间复杂度
    空间复杂度为O(n),这是因为我们使用了一个哈希表来存储前缀和的出现次数,在最坏的情况下,每个前缀和都不同,哈希表的大小将和数组的长度成正比。

图解

 代码

  public static int subarraySum(int[] nums, int k) {
        HashMap<Integer,Integer> map = new HashMap<>();
        /*目的是如果第一个元素就是目标值,那么我们找prefixSum - k的时候,可以得到1,也就是让次数可以++。
        如果没有这行代码 我们将无法找到前缀和为0的记录,从而无法正确地增加 count 的值*/
        map.put(0,1);
        int prefixSum = 0;
        int count = 0;
        for(int i: nums){
            prefixSum += i;

            //之所以是这种顺序是因为,是因为从之前的前缀数组中的某个点到当前点的子数组的和等于 k
            //至于具体为什么,如果先更新map,更新完成后,判断map中是否存在prefixSum - k ,恰好存在,且值恰好为当前的前缀和,并不能得出一定会有相加为K的子数组,
            // 只有在map中没有当前前缀和的时候,才能判断出有相加为K的子数组

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

问题

顺序问题

在这里讲讲 为什么要先 if 条件判断,再往 map 添加键值对。

始终注意一点:

当我们计算当前的前缀和 prefixSum 时,我们检查是否存在一个前缀和 prefixSum - k 在哈希表中。如果存在,这意味着在原数组 nums 中,从某个点到当前点的子数组的和等于 k

说的再精确一点,就是从不包括当前节点的前缀和中的某个点,到当前点的子数组和为K。

具体表现就在于:如果先更新map,更新完成后,判断map中是否存在prefixSum - k ,如果恰好存在,且值恰好为算上当前节点的前缀和,但是这样并不能得出一定会有和相加为K的子数组,只有在map中没有当前前缀和的时候,才能判断出有相加和为K的子数组。

count 累加问题

举个例子来说明:

假设我们有数组 nums = [1, 2, 3, -1, 2],我们要找和为 k = 3 的子数组。

  • 当我们遍历到索引2(值为3)时,prefixSum 是6,prefixSum - k 是3,而哈希表中已经有前缀和3的记录,且出现次数为1。这意味着从索引0到索引2的子数组和为3,所以我们增加 count 的值为1。

  • 当我们继续遍历到索引4(值为2)时,prefixSum 是8,prefixSum - k 是5,而哈希表中已经有前缀和5的记录,且出现次数为1。这意味着从索引1到索引4的子数组和为3,所以我们再次增加 count 的值为1。

因此,count 的值反映了和为 k 的子数组的总数量,而不是每次发现一个子数组就简单地加1。

初始化问题

举个例子来说明:

假设我们有数组 nums = [3, 2, 1, 2],我们要找和为 k = 3 的子数组。

  • 当我们遍历到索引0(值为3)时,prefixSum 是3,prefixSum - k 是0,而哈希表中已经有前缀和0的记录,且出现次数为1。这意味着从索引0到索引0的子数组和为3,所以我们增加 count 的值为1。

如果没有 prefixSumCount.put(0, 1); 这一行,那么在第一次迭代时,我们将无法找到前缀和为0的记录,从而无法正确地增加 count 的值。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IP协议,网络层

一、IP协议报文 在网络层最主要的协议是IP协议&#xff0c;网络层的主要任务是进行&#xff1a;1.地址管理 2.路由选择 地址管理&#xff1a;使用一套地址体系&#xff0c;描述互联网中每个设备所处的位置。 IP地址有两个版本&#xff0c;1.IPV4 2.IPV6 &#xff0c;IP…

基于STM32F103ZE平台分析FreeRtos(九)——协程

目录 一、协程简介 二、协程工作机制 2.1 协程控制块结构 2.2 协程管理方式 2.3 协程调度方式 2.4 协程通信机制 三、协程状态及状态切换 3.1 协程状态 3.2 状态切换 四、协程创建 五、协程调度分析 5.1 源码分析 5.2 逻辑图分析 六、协程通信 6.1 协程发送消息…

Edge的使用心得和深度探索-Sider: ChatGPT 侧边栏

作为一款备受欢迎的网络浏览器&#xff0c;Microsoft Edge在用户体验和功能方面都有着诸多优势。在长期的使用中&#xff0c;我总结出了三条使用心得&#xff0c;同时也发现了三个能够极大提高效率的功能。让我们一起深度探索Edge的潜力吧&#xff01; 使用心得&#xff1a; 界…

Android 10.0 Launcher3定制folder文件夹2x2布局之一xml文件配置和解析相关属性

1.前言 在10.0的系统rom产品定制化开发中,在对Launcher3的folder文件夹功能定制中,要求folder文件夹跨行显示,就是 2x2布局显示,默认的都是占1格的,现在要求占4格显示,系统默认是不支持显示4格的,所以接下来需要分析相关的 功能,然后来实现这个功能 2.Launcher3定制fo…

C# WCF服务(由于内部错误,服务器无法处理该请求。)

由于内部错误&#xff0c;服务器无法处理该请求。有关该错误的详细信息&#xff0c;请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为)以便将异常信息发送回客户端&#xff0c;或打开对每个 Microsoft .NET …

Windows+Linux的虚拟串口工具

文章目录 1.Windows虚拟串口工具1.1 安装教程1.2 使用方法 2.Linux系统虚拟串口工具2.1 socat安装2.2 开启虚拟串口2.3 测试2.3.1 命令测试2.3.2 Cutecom工具测试 2.4 关闭虚拟串口 3.参考资料 1.Windows虚拟串口工具 下载地址&#xff1a;https://www.downxia.com/downinfo/4…

CCF-Csp算法能力认证, 202303-1重复局面(C++)含解析

前言 推荐书目&#xff0c;在这里推荐那一本《算法笔记》&#xff08;胡明&#xff09;&#xff0c;需要PDF的话&#xff0c;链接如下 「链接&#xff1a;https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd6vdq# 提取码&#xff1a;6vdq”复制这段内容后打开手机迅雷…

解决springboot项目的网站静态页面显示不全问题

在通过springboot搭建项目时&#xff0c;为了能够访问静态的前端页面&#xff0c;我们考虑到访问的优先级问题&#xff0c;通常选择将资源放在recourses/static的目录下&#xff0c;如下&#xff1a; 这时可能会出现类似于下面这种图片无法加载、没有按照指定位置显示的情况&am…

Python-100-Days: Day09 Object-oriented programming(OOP) Upgrade

1.property装饰器 之前有讨论过&#xff0c; Python中属性和方法访问权限的问题&#xff0c;不建议将属性设置为私有的&#xff0c;倘若直接将属性暴露给外界也是存在问题的。例如&#xff0c;我们没有办法检查赋给属性的值是否有效。之前的建议是将属性命名以单下划线开头&am…

【线性代数】俗说矩阵听课笔记

基础解系的概念 31线性相关&#xff0c;线性无关&#xff0c;拓展与证明 n个m维向量在n<m时可能线性相关也可能线性无关&#xff0c;线性无关时可以构成某个m维空间的一组基。m不小于n时&#xff0c;秩小于n则线性相关。 n个m维向量在n>m时可一定线性相关。低维向量一定…

microsoft的azure语音,开发环境运行正常,发布到centos7线上服务器之后,无法运行

最近在做AI语音对话的功能&#xff0c;用到了azure的语音语音服务&#xff0c;开发的时候还算顺利&#xff0c;部署到线上后&#xff0c;发现在正式服上无法完成语音转文本的操作&#xff0c;提示&#xff1a; org.springframework.web.util.NestedServletException: Handler d…

2024-05-08 问AI: 在深度学习中,介绍一下RMSProp 优化器

文心一言 在深度学习中&#xff0c;RMSProp&#xff08;Root Mean Square Propagation&#xff09;优化器是一种常用的优化算法&#xff0c;主要用于神经网络训练的梯度下降算法的变体。它是对Adagrad优化器的一种改进&#xff0c;旨在解决Adagrad中学习率过快下降的问题。 R…

HTML学习|初识表单post和get提交、文本框和单选框、按钮、多选框和下拉框、文本域和文件域、搜索框滑块和简单验证、表单的应用、表单初级验证

初识表单post和get提交 form标签是表单&#xff0c;method控制表单提交方式&#xff0c;get方式&#xff0c;表单填写的参数能够在跳转的url地址中看到&#xff0c;post方式是看不到的&#xff0c;action是向何处跳转表单数据 input标签&#xff0c;且typetext&#xff0c;是…

恋爱中的Java多线程:从单身到共舞的浪漫指南(一)

引言&#xff1a;孤独的线程&#xff0c;寂寞的码农 开篇小剧场&#xff1a; ​ 深夜&#xff0c;孤独的程序猿凯叔接到新任务&#xff1a;优化程序性能&#xff0c;探索多线程。这一任务成了他跳出孤独、寻求生活并行美好的契机。从简单的Thread类到复杂的线程池管理&#xff…

基于二维CS-SCHT变换和扩频方法的彩色图像水印嵌入和提取算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................. % figure; % subplot(121);…

GitLab使用记录

GitLab 文章目录 1. 常用命令1.1 配置邮箱 用户名1.2 查看配置1.3 基本语法 2. 连接gitlab3. 直接拉去项目 1. 常用命令 1.1 配置邮箱 用户名 git config --global user.name ShangzheChen git config --global user.email 735511377qq.com1.2 查看配置 cat ~/.gitconfig这…

SpringCloud微服务之Eureka、Ribbon、Nacos详解

SpringCloud微服务之Eureka、Ribbon、Nacos详解 1、认识微服务1.1、单体架构1.2、分布式架构1.3、微服务1.4、SpringCloud 2、服务拆分与远程调用2.1、服务拆分的原则2.2、服务拆分示例2.2、提供者与消费者 3、Eureka注册中心3.1、Eureka的结构和作用3.2、搭建eureka-server3.2…

图像处理:图像噪声添加

文章目录 前言一、高斯噪声二、椒盐噪声三、泊松噪声四、斑点噪声五、指数噪声六、均匀噪声总结 前言 本文主要介绍几种添加图像噪声的方法&#xff0c;用于数据增强等操作。 以下图为例。 一、高斯噪声 高斯噪声就是给图片添加一个服从高斯分布的噪声&#xff0c;可以通过调…

Java | Leetcode Java题解之第77题组合

题目&#xff1a; 题解&#xff1a; class Solution {List<Integer> temp new ArrayList<Integer>();List<List<Integer>> ans new ArrayList<List<Integer>>();public List<List<Integer>> combine(int n, int k) {List&l…

Java | Leetcode Java题解之第78题子集

题目&#xff1a; 题解&#xff1a; class Solution {List<Integer> t new ArrayList<Integer>();List<List<Integer>> ans new ArrayList<List<Integer>>();public List<List<Integer>> subsets(int[] nums) {dfs(0, nums…