Leetcode-每日一题【剑指 Offer II 010. 和为 k 的子数组】

news2024/10/11 0:28:09

题目

给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数。

示例 1:

输入:nums = [1,1,1], k = 2
输出: 2
解释: 此题 [1,1] 与 [1,1] 为两种不同的情况


示例 2:

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

提示:

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

解题思路

前置知识

前缀和

前缀和:顾名思义,是要求前缀的总和,什么是前缀,对于一个存放数字的数组而言,前缀就是指的数组的前k项,因此对应的前缀和就是数组前k项的和。前缀和一般用来求数组中连续段子数组的值的和,类似于等差数列中利用等差数列的和来求某一段子数列的和:在这里插入图片描述

 举个例子:

我们有一个数组nums = [2,4,6,1,4]

下面我们来计算nums数组的前缀和数组arr,arr[i] = arr[i-1] + nums[i]

第一个元素由于没有前缀所以只能是nums[0],也就是2 

 第二个元素就等于arr[1] = arr[0] + nums[1]

 

 

 

 我们得到的nums的前缀和数组就为 arr = [2,6,12,13,17]

作用:

那么我们得到这个前缀和数组到底有什么用呢?

有了前缀和数组我们就可以方便的计算出,一个数组的区间之内的和,例如我们要求出nums[2]~nums[4] 的和。

nums[2]~nums[4] =nums[2] + nums[3] +nums[4] =  arr[4] - arr[1] = 11

可以直接用前缀和数组中的两个元素求出,不用再进行相加操作。这样可以有效的减少我们的重复计算。

代码为:

    public int[] prefix(int[] nums) {
        int[] prefix = new int[nums.length];
        prefix[0] = nums[0];
        for (int i = 1; i < nums.length; ++i) {
            prefix[i] = prefix[i - 1] + nums[i];
        }
        return prefix;
 
    }

1.题目要求我们找到该数组中和为 k 的连续子数组的个数,我们可以先计算出数组的前缀和。

2.然后我们利用两个for循环遍历整个原数组,枚举求出各个区间的和,若和等于k,则answer加一,注意这里,如果区间为[0,n]时,也就是左区间为0时,区间和[0,n] 就等于 arr[n],这个情况比较特殊所以我们要单独计算。最后返回answer即可。

代码实现

class Solution {
    public int subarraySum(int[] nums, int k) {
        int[] sum = new int[nums.length];
        sum[0] = nums[0];
        for(int i = 1; i < nums.length; i++){
            sum[i] = sum[i-1] + nums[i];
        }
        int answer = 0;
        for(int i = 0; i < nums.length; i++){
            if(sum[i] == k){
                answer++;
            }
            for(int j = i + 1; j < nums.length; j++){
                if(  sum[j] - sum[i] == k){
                    answer ++;
                }
            }
        }

        return answer;
    }
}

测试结果

 

 

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

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

相关文章

SIP视频对讲sip广播网关

SV-PA2是专门对行业用户需求研发的一款SIP音视频对讲&#xff0c;媒体流传输采用标准IP/RTP/RTSP协议。它很好的继承了锐科达话机稳定性好、电信级音质的优点&#xff0c;且完美兼容当下所有基于SIP的主流IPPBX/软交换/IMS平台,如Asterisk, Broadsoft, 3CX, Elastix 等。它集多…

linux 使用nethogs命令查看各个进程使用网络的情况

1&#xff0c;使用nethogs命令查看各个进程使用网络的情况 #yum -y install nethogs 2&#xff0c;使用nethogs命令查看进程使用网络的情况 #nethogs

【Docker】Docker部署私有仓库的配置及应用

文章目录 一、Docker-registry 搭建本地私有仓库1. Registry 的概念2. Registry 的部署过程 二、Docker-harbor 搭建私有仓库1. 什么是Harbor2. Harbor 的特性3. Harbor的构成4. Harbor 的部署过程4.1 安装 harbor4.2 创建项目并进行上传下载4.3 上传镜像到私有仓库4.4 从私有仓…

LLM Data Pipelines: 解析大语言模型训练数据集处理的复杂流程

编者按&#xff1a;在训练大语言模型的过程中,构建高质量的训练数据集是非常关键的一步&#xff0c;但关于构建大模型训练所需数据集的通用数据处理流程&#xff08;Data pipelines)的相关资料极为稀少。 本文主要介绍了基于Common Crawl数据集的数据处理流程。首先,文章概述了…

Java版知识付费源码 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台 +支持二次开发定制

提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含&#xff1a;录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署&#xff0c;免费售后&#xff0c;专业技术指导&#xff0c;支持PC、APP、H5、小程序多终端同步&#xff0c;支持二次开发…

SNMP协议是什么?

SNMP协议是什么&#xff1f; 简单网络管理协议&#xff08;Simple Network Management Protocol&#xff0c;SNMP&#xff09;是由互联网工程任务组定义的一套网络管理协议。该协议是基于简单网关监视协议&#xff08;Simple Gateway Monitor Protocol&#xff0c;SGMP&#x…

芯片制造详解.晶圆的诞生.学习笔记(二)

芯片制造详解.晶圆的诞生.学习笔记.二 一、硅片的制造二、硅片、晶圆和芯片的区别三、从硅棒到晶圆(1).截断(2).四探针法(3).裁成硅段(4).滚磨(5).研磨定位边(槽)(6).硅段切片(7).磨片(8).倒角(9).打上激光标识码(10).刻蚀(11).化学机械抛光(CMP)(12).湿法清洗(13).检测 包装 四…

Nodejs 安装之后cmd 输入npm -v 提示error的问题解决

1.问题现象&#xff1a; 安装时候选择&#xff1a; 2. 解决问题 卸载nodejs 删除安装路径下的node_modules, 重新安装 按照下面的选择

指数函数exp

目录 指数函数及e 指数增长 复数指数 练习 1. expgui 2. 计算e 3 五角星绘制 指数函数及e &#xff08;1&#xff09;的比值总是常数 &#xff08;2&#xff09;的导数为其自身。&#xff08;根据比值1推导出e的值&#xff09; %% Plot a^t and its approximate derivat…

vue预览和下载txt、PDF、execl等在线文件

因为浏览器默认能直接打开TXT、PDF等文件索引默认就是点击链接打开文件。但是浏览器却又不能在线打开execl、world等文件。 现在我们可以统一的实现文件的预览以及下载。 下载文件 downloadfile方法 downloadfile(url,fileName){const newUrl url;const x new XMLHttpRequ…

Rust vs Go:常用语法对比(七)

题图来自 Go vs Rust: Which will be the top pick in programming?[1] 121. UDP listen and read Listen UDP traffic on port p and read 1024 bytes into buffer b. 听端口p上的UDP流量&#xff0c;并将1024字节读入缓冲区b。 import ( "fmt" "net&qu…

C数据结构与算法——队列 应用(C语言纯享版 迷宫)

实验任务 (1) 掌握顺序循环队列及其C语言的表示&#xff1b; (2) 掌握入队、出队等基本算法的实现&#xff1b; (3) 掌握顺序循环队列的基本应用&#xff08;求解迷宫通路&#xff09;。 实验内容 使用C语言实现顺序循环队列的类型定义与算法函数&#xff1b;编写main()函数…

架构设计-高性能(一、存储高性能)

1.简介 数据存储的性能是系统高性能的两大组成部分之一。目前市场的数据存储技术是五花八门&#xff0c;并且目前针对在大数据环境下针对不同的需求和场景提出了更多不同类型的数据库。本文主要讲解分类中的关系型数据库和NoSql数据库的高性能。 2.关系型数据库 虽然存储技术在…

ClickHouse(二):ClickHouse特性

​目录 1. 完备的DBMS功能 2. 列式存储 3. 数据压缩 4. 向量化执行引擎 5. 关系模型与标准SQL查询 ​​​​​​​6. 多样化的表引擎 ​​​​​​​7. 多线程与分布式 ​​​​​​​8. 多主架构 ​​​​​​​9. 交互式查询 ​​​​​​​10. 数据分片与分布式查询…

03 shell 编程

变量 语言型 编译型语言 解释型语言 shell脚本语言是解释型语言shell脚本的本质&#xff1a;shell命令的有序集合 shell 编程的基本过程 基本过程分为三步&#xff1a; step1. 建立 shell 文件 包含任意多行操作系统命令或shell命令的文本文件; step2. 赋予shell文件执行…

Flutter 状态组件 InheritedWidget

Flutter 状态组件 InheritedWidget 视频 前言 今天会讲下 inheritedWidget 组件&#xff0c;InheritedWidget 是 Flutter 中非常重要和强大的一种 Widget&#xff0c;它可以使 Widget 树中的祖先 Widget 共享数据给它们的后代 Widget&#xff0c;从而简化了状态管理和数据传递…

Spark(36):Structured Streaming 编程模型

目录 0. 相关文章链接 1. 的核心思想 2. 基本概念 2.1. 输入表 2.2. 结果表 2.3. 输出 2.4. 快速入门代码的再次说明 3. 处理事件-时间和延迟数据(Handling Event-time and Late Data) 4. 容错语义 0. 相关文章链接 Spark文章汇总 1. 的核心思想 Structured Streami…

4、非线性数据结构

上一节课我们讲了线性数据结构&#xff0c;这一节我们说下非线性数据结构。 非线性数据结构&#xff0c;从字面意思来看&#xff0c;就是指不是线性的结构。线性结构的特点是只有一个前驱和一个后继。 那么非线性结构的特点就是有多个前驱或后继了。 如果只存在一个没有前驱的…

第一次编程测试(分频器)

一&#xff0c;分频器 定义 分频器&#xff08;Divider&#xff09;是一种电子电路或设备&#xff0c;用于将输入信号的频率降低到较低的频率。它常用于数字系统、通信系统和计时应用中。原理 整数分频器使用计数器来实现频率的降低。计数器根据输入信号的边沿触发进行计数&am…

STM32MP157驱动开发——按键驱动(中断)

文章目录 编写使用中断的按键驱动程序编程思路设备树相关驱动代码相关 代码修改设备树文件gpio_key_drv.cMakefile编译测试 编写使用中断的按键驱动程序 对于使用中断的按键驱动&#xff0c;内核自带的驱动程序 drivers/input/keyboard/gpio_keys.c 就可以&#xff0c;需要做的…