【LeetCode 热题 100】560. 和为 K 的子数组——(解法一)前缀和+暴力

Problem: 560. 和为 K 的子数组
题目:给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。子数组是数组中元素的连续非空序列。

【LeetCode 热题 100】560. 和为 K 的子数组——(解法二)前缀和+哈希表

整体思路

这段代码的目的是计算一个整数数组 nums 中,和为特定值 k连续子数组 的个数。例如,对于 nums = [1, 1, 1]k = 2,连续子数组 [1, 1] 有两个,它们分别从索引 0 和 1 开始,所以结果是 2。

该算法采用了一种基于 前缀和(Prefix Sum) 的暴力枚举法。其核心逻辑步骤如下:

  1. 预处理:计算前缀和

    • 算法首先创建了一个比原数组 nums 长一个单位的数组 sumsum[i] 被设计用来存储 nums 数组中从索引 0 到 i-1 的所有元素的累加和。
    • sum[0] 初始化为 0,作为计算的基准。
    • 通过一次遍历,计算出所有前缀和,即 sum[i+1] = sum[i] + nums[i]
    • 核心优势:一旦拥有了前缀和数组,我们就可以在 O(1) 的时间内计算出任意连续子数组 nums[i...j] 的和。其计算公式为 sum[j+1] - sum[i]。这避免了在每次检查子数组时都进行重复的求和计算,将一个潜在的 O(N^3) 算法优化到了 O(N^2)。
  2. 枚举所有子数组并校验

    • 接下来,代码使用两层嵌套的循环来枚举出所有的连续子数组。
    • 外层循环的变量 j 代表子数组的 结束索引
    • 内层循环的变量 i 代表子数组的 起始索引
    • 通过 for (j=0..n-1)for (i=0..j) 的组合,可以不重不漏地生成所有可能的 (i, j) 对,即所有连续子数组。
    • 对于每一个由 (i, j) 定义的子数组,利用前缀和数组,通过 sum[j+1] - sum[i] 快速得到其和。
    • 将计算出的和与目标值 k进行比较。如果相等,则将计数器 ans 加一。
  3. 返回结果

    • 在遍历完所有可能的子数组后,ans 中就存储了最终的总数,将其返回。

总而言之,该算法通过预计算前缀和,然后系统地遍历所有可能的子数组端点,来解决这个问题。虽然它不是最优解法(最优解法使用哈希表,时间复杂度为O(N)),但它是一个思路清晰且正确的暴力解法。

完整代码

class Solution {/*** 计算和为 k 的连续子数组的个数。* @param nums 整数数组* @param k 目标和* @return 和为 k 的连续子数组的数量*/public int subarraySum(int[] nums, int k) {// 获取数组的长度int n = nums.length;// 创建前缀和数组 sum,长度为 n+1。// sum[i] 将存储 nums[0] 到 nums[i-1] 的和。// sum[0] = 0,作为计算的起点,代表空数组的和。int[] sum = new int[n + 1];// ans 用于累计和为 k 的子数组的数量int ans = 0;// 步骤 1: 预计算前缀和// 遍历 nums 数组,填充 sum 数组for (int i = 0; i < n; i++) {// sum[i+1] 等于前 i 个元素的和(sum[i])加上当前元素 nums[i]sum[i + 1] = sum[i] + nums[i];}// 步骤 2: 枚举所有子数组// 外层循环确定子数组的结束索引 jfor (int j = 0; j < n; j++) {// 内层循环确定子数组的起始索引 i// i 的范围是从 0 到 j,确保 i <= jfor (int i = 0; i <= j; i++) {// 利用前缀和快速计算子数组 nums[i...j] 的和// sum[j+1] 是 nums[0...j] 的和// sum[i]   是 nums[0...i-1] 的和// 两者相减即为 nums[i...j] 的和if (sum[j + 1] - sum[i] == k) {// 如果子数组的和等于 k,计数器加 1ans++;}}}// 返回最终的计数结果return ans;}
}

时空复杂度

时间复杂度:O(N^2)
  1. 前缀和计算:第一个 for 循环遍历 nums 数组一次,用于计算前缀和。这个循环执行了 N 次。因此,这部分的时间复杂度是 O(N)
  2. 子数组枚举
    • 第二个(外层)for 循环的变量 j0N-1,执行 N 次。
    • 第三个(内层)for 循环的变量 i0j。其执行次数依赖于 j
    • 总的执行次数是 1 + 2 + 3 + ... + N,这是一个等差数列求和,结果为 N * (N + 1) / 2
    • 因此,嵌套循环部分的复杂度为 O(N^2)
  3. 循环内部操作:在最内层循环中,sum[j + 1] - sum[i] 和比较操作都是 O(1) 的。

综合分析
算法的总时间复杂度由各部分相加决定:O(N) + O(N^2)。在 Big O 表示法中,我们只保留最高阶项,所以最终的时间复杂度是 O(N^2)

空间复杂度:O(N)
  1. 主要存储开销:算法创建了一个名为 sum 的整型数组来存储前缀和。
  2. 空间大小:该数组的长度是 n + 1,其中 n 是输入数组 nums 的长度。因此,它占用的空间与输入规模 N 成线性关系。
  3. 其他变量n, ans, i, j 等变量都只占用常数级别的空间,即 O(1)。

综合分析
算法所需的额外空间主要由前缀和数组 sum 决定。因此,空间复杂度为 O(N)

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

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

相关文章

android车载开发之HVAC

目前主要在做车载hvac的开发&#xff0c;主要的一些功能主要是hvac&#xff0c;座椅&#xff0c;香氛&#xff0c;设置等的一些模块&#xff0c;具体模块下&#xff0c;比如 1.空调 ac&#xff0c;智能模式&#xff08;极速降温&#xff0c;极速采暖&#xff0c;智能除味&…

深度学习 Diffusers 库(自留)

&#xff08;本文将围绕 安装Diffusers库及其依赖、理解Diffusers核心概念&#xff1a;Pipeline, Model, Scheduler 、使用预训练模型进行推理&#xff08;文生图、图生图等&#xff09; 、 自定义模型和调度器 、训练自己的扩散模型&#xff08;可选&#xff0c;需要大量资源&…

【VPC技术】基础理论篇

文章目录 概述相关基础核心知识软件定义网络SDNOverlay 技术 安全组概述 参考博客 &#x1f60a;点此到文末惊喜↩︎ 概述 相关基础 基本概念 虚拟私有云VPC&#xff1a;是一个隔离的网络环境&#xff0c;每个VPC拥有专属的IP地址范围&#xff08;CIDR&#xff09;、路由表、…

在 RK3588 Ubuntu 上编译 eglinfo:全流程实战 + 常见报错修复

dv1/eglinfo 是一个开源的 EGL 信息检测工具&#xff0c;广泛用于 OpenGL ES 图形栈调试、驱动验证和嵌入式平台图形支持排查。在 Rockchip RK3588 上编译该工具可以协助我们确认 EGL DRM 是否配置正确&#xff0c;尤其在无窗口系统&#xff08;如 eglfs、framebuffer&#xf…

开源推荐:基于前后端分离架构的WMS仓储管理系统

开源推荐&#xff1a;基于前后端分离架构的WMS仓储管理系统 &#x1f525; 在线演示地址&#xff1a;https://tob.toolxq.com/wms/wms.html 点击上方链接可直接体验系统功能和界面&#xff0c;无需安装部署 前言 在企业数字化转型的浪潮中&#xff0c;仓储管理系统&#xff08…

Redis中List类型常见的操作命令有哪些?

Redis中List类型是一个字符串列表&#xff0c;这里是一些常见的命令&#xff1a; 1&#xff09;lpush:将一个或多个值插入到列表头部。列表不存在&#xff0c;一个新的列表会被创建。 2&#xff09;rpush:将一个或多个值插入到列表尾部。 3&#xff09;lpop:移除并返回列表头…

mac重复文件清理,摄影师同款清理方案

摄影师小林盯着屏幕上的警告&#xff1a;“存储空间不足”&#xff0c;离截稿只剩3小时。她的MacBook如同塞满回忆的阁楼&#xff0c;128GB的“其他”空间神秘消失。翻看照片库时&#xff0c;她惊讶地发现——同一组西藏雪山照片竟有十几个副本&#xff01;这是mac重复文件问题…

lua脚本为什么能保证原子性

Redis 处理客户端请求是基于单线程模型的&#xff08; Redis 6.0 开始引入了多线程处理网络 IO&#xff0c;但命令执行仍然是单线程的&#xff09;。这意味着&#xff0c;在任意时刻 Redis 只会执行一个命令或脚本。这种单线程特性确保了当 Redis 在执行一个 Lua 脚本时&#x…

爬虫详解:Aipy打造自动抓取代理工具

一、爬虫的本质与核心功能 爬虫是一种通过编写程序自动抓取互联网公开数据的技术工具&#xff0c;其核心流程包括&#xff1a; 模拟浏览器行为&#xff1a;发送 HTTP 请求访问目标网页解析页面结构&#xff1a;提取 HTML/XML 中的关键信息&#xff08;如文本、链接、图片&…

Leetcode百题斩-栈

终于来到了栈专题&#xff0c;想想之前来阿里的时候就是面试了一道栈最终通过了终面&#xff0c;也是十分怀念了。 739. Daily Temperatures[Medium] 思路&#xff1a;这就是最典型的单调栈问题了。从后向前维护下一个更大值或者下一个更大值的位置。 可以看一下当年面阿里时…

PIXHAWK(ardupilot4.52)NMEA的解析bug

最近在测试过程中发现在椭球高为负的地方&#xff0c;地面站读取GPS_RAW_INT (24)消息中的alt高度竟然是正值。而消息中定义的alt并不是一个unsigned数据&#xff0c;理论上是带有正负符号的。 查看gga的原始信息&#xff1a; $GPGGA,063718.40,3714.8533856,N,11845.9411766,…

Linux容器讲解以及对应软件使用

一、容器基础知识讲解 1.1 微服务的部署策略 部署单体应用意味着运行大型应用的多个相同副本&#xff0c;通常提供若干台&#xff08;N&#xff09;服务器&#xff08;物理机或虚拟 机&#xff09;&#xff0c;在每台服务器上运行若干个&#xff08;M&#xff09;应用实例。部…

企业级应用技术-ELK日志分析系统

目录 #1.1ELK平台介绍 1.1.1ELK概述 1.1.2Elasticsearch 1.1.3Logstash 1.1.4Kibana #2.1部署ES群集 2.1.1基本配置 2.1.2安装Elasticsearch 2.1.3安装Logstash 2.1.4Filebeat 2.1.5安装Kibana 1.1ELK平台介绍 1.1.1ELK概述 ELK 是三个开源工具的缩写&#xff0c;分别是Elas…

Shiro漏洞复现

Shiro简介 Apache Shiro是一种功能强大且易于使用的Java安全框架&#xff0c;它执行身份验证、授权、 加密和会话管理&#xff0c;可用于保护任何应用程序的安全。 Shiro提供了应用程序安全性API来执行以下方面&#xff1a; 1.身份验证&#xff1a;证明用户身份&#xff0c;通…

VSCode 中使用 Google Test(GTest)框架测试

VSCode 中使用 Google Test&#xff08;GTest&#xff09;框架在 VSCode 中对 C 代码进行测试的示例&#xff1a; 一、Unbutu x86使用gtest 环境配置 安装 GTest &#xff1a;在 Ubuntu 系统中&#xff0c;可以通过命令sudo apt-get install libgtest-dev安装 GTest 库。对于…

【1.6 漫画数据库设计实战 - 从零开始设计高性能数据库】

1.6 漫画数据库设计实战 - 从零开始设计高性能数据库 &#x1f3af; 学习目标 掌握数据库表结构设计原则理解字段类型选择与优化学会雪花算法ID生成策略掌握索引设计与优化技巧了解分库分表设计方案 &#x1f4d6; 故事开始 小明: “老王&#xff0c;我总是不知道怎么设计数…

OSPF虚拟链路术语一览:快速掌握网络路由

大家好&#xff0c;这里是G-LAB IT实验室。今天带大家了解一下OSPF的相关知识&#xff01; 01 OSPF虚拟链路术语大全 网络架构中&#xff0c;OSPF&#xff08;开放式最短路径优先&#xff09;是一种重要的路由协议。通过其链路状态路由机制&#xff0c;OSPF能够有效维护和更新…

oracle常用的函数(一) 之 to_char、to_date

文章目录 前言to_char基本语法格式模型格式模型介绍无FM示例使用FM输出货币负数输出尖括号 将日期格式化将数字格式化为带有货币符号和千位分隔符的格式总结 to_date语法语法示例 戳这里&#xff0c;第二弹 → oracle常用的函数&#xff08;二&#xff09; 之 nvl、decode、l…

数据库服务器宕机的处理方法与实战策略

在当今数字化时代,数据库作为企业数据存储与管理的核心,承载着业务运行的关键信息。一旦数据库服务器宕机,将导致业务中断、数据丢失等严重后果,甚至可能给企业带来巨大的经济损失和声誉损害。因此,掌握一套系统、科学的数据库服务器宕机处理方法尤为重要。本文将从应急响…

如何hack边缘的kubelet修改Cgroup数值

之前做了一个VPA项目的需求&#xff0c;就是需要不重启的方式修改容器的Cgroup的值已达到垂直扩缩容的目的&#xff0c;项目中核心的思路如下 上游下发要VPA的结果的值写入到容器的Annotation里面Kubelet 感知到这个 annoation 的变化我们本地运行一个 Agent&#xff0c;里面运…