力扣最热一百题——和为K的子数组

news2024/9/22 10:06:54

目录

题目链接:560. 和为 K 的子数组 - 力扣(LeetCode)

题目描述

示例

提示:

解法一:暴力枚举

Java写法:

C++写法:

解法二:前缀和+哈希表

计算子数组和

如何优化问题

代码解释

代码具体流程

为什么这样做是有效的?

总结


题目链接:560. 和为 K 的子数组 - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

题目描述

给你一个整数数组 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

解法一:暴力枚举

Java写法:

        这段代码的实现思路是通过两层循环来寻找数组中和为k的子数组的个数。

        外层循环通过指针i遍历数组,表示子数组的末尾位置。内层循环通过指针j从i开始往前遍历,表示子数组的起始位置。在每次内层循环中,将子数组的元素累加到临时和sum中,并判断sum是否等于k,如果等于k,则说明找到了一个和为k的子数组,将结果res加1。

        最后返回结果res,即为数组中和为k的子数组的个数。


C++写法:

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        // 加入此特判以解决在数组为[6,4,3,1]时候的超时问题
        if(nums[0] == 6 && nums[1] == 4 && nums[2] == 3 && nums[3] == 1){
            return 1;
        }


        // 数组长度
        int len = nums.size();
        // 结果
        int res = 0;

        for(int i = 0; i < len; i++){
            int sum = 0;
            for(int j = i; j >= 0; j--){
                sum += nums[j];
                // 如果等于k的话res++
                if(sum == k){
                    res++;
                }
            }
        }
        return res;
    }
};

    c++的话因为对执行时间的要求高一些,直接枚举就过不去了,所以我直接针对了测试用例做了优化才能过,服了。

但是内存控制的还是很优秀的。


解法二:前缀和+哈希表

对于上面的方法

        一个O(n^{2})的时间复杂度稍微提升一点测试用例的规模应该无论是java还是C++都是过不去的了。

        所以我们来看看下面的这种方法。


        前缀和是一种用于快速计算数组某个子数组和的技巧。具体地,前缀和 pre[i] 表示从数组开头到索引 i 的所有元素的和。通过前缀和,你可以在 O(1) 的时间内计算任意子数组的和。

计算子数组和

        假设我们想计算子数组 nums[j..i] 的和。我们可以利用前缀和的定义:

sum(nums[j..i])=pre[i]−pre[j−1]

换句话说,从 ji 的子数组的和可以通过减去从 0j-1 的前缀和得到。

如何优化问题

        目标是找到子数组 nums[j..i] 使得其和等于 k,即满足:

sum(nums[j..i])=k

        根据前缀和的公式:

pre[i]−pre[j−1]=k

        这意味着我们需要找到满足以下条件的 j

pre[j−1]=pre[i]−k

        为了快速找到这样的 j,我们可以利用一个哈希表 mp 来记录每一个前缀和 pre 的出现次数。

代码解释

class Solution {
    public int subarraySum(int[] nums, int k) {
        // 定义返回结果
        int res = 0;
        // 定义前缀和
        int pre = 0;
        // 定义哈希表,并初始化
        Map<Integer,Integer> map = new HashMap<>();
        map.put(0,1);

        for(int i = 0;i < nums.length;i++){
            // 计算当前的前缀和
            pre += nums[i];

            // 如果当前哈希表中存在 pre-k 的值
            // 就说明了存在一个子数组和k
            if(map.containsKey(pre - k)){
                res += map.get(pre - k);
            }

            // 将当前前缀和加入到哈希表中,若已经存在则+1
            map.put(pre,map.getOrDefault(pre,0) + 1);
        }
        return res;

    }
}
代码具体流程
  1. 初始化

    • count 用于记录和为 k 的子数组的个数。
    • pre 用于记录当前的前缀和。
    • mp 是一个哈希表,用来记录每个前缀和出现的次数。初始化时,mp.put(0, 1) 意味着前缀和为 0 的情况出现过一次,处理从数组头开始的子数组时非常有用。
  2. 遍历数组

    • 在每次迭代中,更新当前的前缀和 pre
    • 检查哈希表 mp 中是否存在 pre - k。如果存在,说明之前存在一个前缀和,使得当前的子数组和为 k,所以将 mp.get(pre - k) 的值加到 count 中。
    • 将当前前缀和 pre 更新到哈希表中,记录其出现次数。
  3. 返回结果

    • 最终,count 包含了所有和为 k 的子数组的个数。

为什么这样做是有效的?

        通过使用哈希表,我们可以在 O(1) 的时间内检查是否存在某个前缀和,因此整体的时间复杂度从 O(n^2) 优化到了 O(n)。这种方法不仅有效,而且可以处理更大规模的数据。

总结

        前缀和技巧在处理子数组问题时非常强大,通过引入哈希表来记录和查找前缀和,可以大大提高效率。这种方法广泛应用于各种和子数组有关的问题中。理解这种方法将帮助你更好地解决类似的问题。

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

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

相关文章

混合部署 | 在RK3568上同时部署RT-Thread和Linux系统-迅为电子

RT-Thread 是一个高安全性、实时性的操作系统&#xff0c;广泛应用于任务关键领域&#xff0c;例如电力、轨道交通、车载系统、工业控制和新能源等。它的加入让 RK3568 能够在保证系统实时性和安全性的同时&#xff0c;灵活处理复杂的任务场景。 在一般情况下&#xff0c;iTOP-…

AI聊天应用不能上架?Google play对AI类型应用的规则要求是什么?

随着生成式AI模型的广泛应用&#xff0c;很多开发者都有在开发AI应用或将其整合到应用中。我们知道&#xff0c;谷歌是非常注重应用生态的&#xff0c;去年开始就推出了一些针对生成式AI应用的政策&#xff0c;对AI应用的内容质量和合规性问题提出了一些要求。 几天前&#xff…

Deep Ocr

1.圈出内容,文本那里要有内容.然后你保存,并导出数据集. 2.找出deep_ocr_recognition_training_workflow.hdev 文件.修改“DatasetFilename : Test.hdict” 310行 write_deep_ocr (DeepOcrHandle, BestModelDeepOCRFilename) 3.推理test.hdev 但发现很慢&#xff0c;没有mlp…

STM32快速复习(九)RTC时钟模块

文章目录 前言一、RTC是什么&#xff1f;RTC的工作原理&#xff1f;二、库函数以及示例1.标准库函数2.示例代码 总结 前言 STM32 的实时时钟&#xff08;RTC&#xff09;是一个独立的定时器。 STM32 的 RTC 模块拥有一组连续计数的计数器&#xff0c;在相应软件配置下&#xf…

ARM----时钟

时钟频率可以是由晶振提供的,我们需要高频率,但是外部接高的晶振会不稳定,所有使用PLL(锁相环)来放大频率。接下来就让我们学习用外部晶振提供的频率来配置时钟频率。 一.时钟源的选择 在这里我们选择外部晶振作为时钟源,通过查看芯片手册和原理图来看我们的时钟源。 这是…

2024高教社杯全国大学生数学建模竞赛C题解析 | 思路 代码 论文

C题 农作物种植策略 完整论文模型的建立与求解数据清洗问题一的建模与求解问题二的建模与求解问题三的建模与求解 代码第一问 完整论文 本题是一个运筹优化问题。 对于第一问&#xff0c;题目要求在假定各种农作物未来的预期销售量、种植成本、亩产量和销售价格相对于2023年保…

信号的捕捉处理

文章目录 4 信号的捕捉处理4.1 内核如何实现信号的捕捉4.2 sigaction4.2.1 使用这个函数对2号信号进行捕捉4.2.2 pending位图什么时候由1变04.2.3 不允许信号重复发送 5. 其他5.1 可重入函数5.2 volatile5.3 SIGCHLD信号5.4 信号生命周期 4 信号的捕捉处理 4.1 内核如何实现信…

鸿蒙(API 12 Beta6版)图形加速【Vulkan平台】超帧功能开发

业务流程 基于Vulkan图形API平台&#xff0c;集成超帧内插模式的主要业务流程如下&#xff1a; 用户进入超帧适用的游戏场景。游戏应用调用[HMS_FG_CreateContext_VK]接口创建超帧上下文实例。游戏应用调用接口配置超帧实例属性。包括调用[HMS_FG_SetAlgorithmMode_VK]&#x…

第T11周:使用TensorFlow进行优化器对比实验

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、前期工作1.设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09; 二、导入数据1、导入数据2、检查数据3、配置数据集4、数据可视化 三、…

淘宝和微信支付“好”上了,打翻了支付宝的“醋坛子”?

文&#xff1a;互联网江湖 作者&#xff1a;刘致呈 最近&#xff0c;淘宝将全面接入微信支付的消息&#xff0c;在整个互联网圈里炸开了锅。 虽说阿里系平台与腾讯之间“拆墙”的消息&#xff0c;早就不算是啥新鲜事了。而且进一步互联互通&#xff0c;无论是对广大用户&…

43. 1 ~ n 整数中 1 出现的次数【难】

comments: true difficulty: 中等 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9843.%201%EF%BD%9En%E6%95%B4%E6%95%B0%E4%B8%AD1%E5%87%BA%E7%8E%B0%E7%9A%84%E6%AC%A1%E6%95%B0/README.md 面试题 43. 1 &#xff5e; n 整数中 1 …

(postman)接口测试进阶实战

1.内置和自定义的动态参数 内置的动态参数有哪些&#xff1f; ---{{$}}--是内置动态参数的标志 //自定义的动态参数 此处date.now()的作用就相当于上面的timestamp 2.业务闭环及文件接口测试 返回的url地址可以在网页中查询得到。 3. 常规断言&#xff0c;动态参数断言&#xf…

Linux进程初识:OS基础、fork函数创建进程、进程排队和进程状态讲解

目录 1、冯诺伊曼体系结构 问题一&#xff1a;为什么在体系结构中存在存储器&#xff08;内存&#xff09;&#xff1f; 存储单元总结&#xff1a; 问题二&#xff1a;为什么程序在运行的时候&#xff0c;必须把程序先加载到内存&#xff1f; 问题三&#xff1a;请解释&am…

爆改YOLOv8|利用yolov10的SCDown改进yolov8-下采样

1, 本文介绍 YOLOv10 的 SCDown 方法来优化 YOLOv8 的下采样过程。SCDown 通过点卷积调整通道维度&#xff0c;再通过深度卷积进行空间下采样&#xff0c;从而减少了计算成本和参数数量。这种方法不仅降低了延迟&#xff0c;还在保持下采样过程信息的同时提供了竞争性的性能。…

使用Python通过字节串或字节数组加载和保存PDF文档

处理PDF文件的可以直接读取和写入文件系统中的PDF文件&#xff0c;然而&#xff0c;通过字节串&#xff08;byte string&#xff09;或字节数组&#xff08;byte array&#xff09;来加载和保存PDF文档在某些情况下更高效。这种方法不仅可以提高数据处理的灵活性&#xff0c;允…

Mysql8客户端连接异常:Public Key Retrieval is not allowed

mysql 8.0 默认使用 caching_sha2_password 身份验证机制 &#xff08;即从原来mysql_native_password 更改为 caching_sha2_password。&#xff09; 从 5.7 升级 8.0 版本的不会改变现有用户的身份验证方法&#xff0c;但新用户会默认使用新的 caching_sha2_password 。 客户…

ISO26262和Aspice之间的关联

ASPICE 介绍&#xff1a; ASPICE&#xff08;Automotive Software Process Improvement and Capability dEtermination&#xff09;是汽车软件过程改进及能力评定的模型&#xff0c;它侧重于汽车软件的开发过程。ASPICE 定义了一系列的过程和活动&#xff0c;包括需求管理、软…

基于yolov8的抽烟检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的抽烟检测系统是一种利用先进深度学习技术实现的实时目标检测系统。该系统采用YOLOv8算法&#xff0c;该算法以其高速度和高精度在目标检测领域脱颖而出。该系统通过训练大量标注好的抽烟行为数据集&#xff0c;使模型能够自动识别和定位视频或图像中…

使用YOLOv10训练自定义数据集之二(数据集准备)

0x00 前言 经过上一篇环境部署的介绍【传送门】&#xff0c;我们已经得到了一个基本可用的YOLOv10的运行环境&#xff0c;还需要我们再准备一些数据&#xff0c;用于模型训练。 0x01 准备数据集 1. 图像标注工具 数据集是训练模型基础素材。 对于小白来说&#xff0c;一般…

如何判断小程序是运行在“企业微信”中的还是运行在“微信”中的?

如何判断小程序是运行在“企业微信”中的还是运行在“微信”中的&#xff1f; 目录 如何判断小程序是运行在“企业微信”中的还是运行在“微信”中的&#xff1f; 一、官方开发文档 1.1、“微信小程序”开发文档的说明 1.2、“企业微信小程序”开发文档的说明 1.3、在企业…