Leetcode——560. 和为 K 的子数组

560. 和为 K 的子数组 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/subarray-sum-equals-k/description/

题目描述:

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

题目解析:

 根据题目我们可以得知本题要求我们找到和为 k 的非空连续子序列的个数并将个数返回。

例如:假设nums:{1,2,2,3}  k : 3

我们可以从中找出三组和为 k 的数组,但是因为题目要求的是连续且非空所以只有1,3两组符合题意,结果返回 2。

暴力求解:

直接根据题目的要求挨个求和判断结果是否为 k ;

class Solution {
    public int subarraySum(int[] nums, int k) {
        //用来记录符合题意的数组个数
        int count = 0;
        int len = nums.length;
        //直接暴力求和
        for (int i = 0; i < len; i++) {
            int tmp = 0;
            for (int j = i; j < len; j++) {
                tmp += nums[j];
                if (tmp == k) {
                    count++;
                }
            }
        }
        return count;
    }
}

它好歹是个中等难度的题这道题用暴力解法可以通过是我没有想到的。

前缀和优化:

虽然暴力解法可以通过但是用时是非常长的,因为题目并只要求我们返回符合题意的数组数目,所以我们可以利用前缀和来对暴力解法进行优化:

  • 第一步:先求出每个位置的前缀和;
  • 第二步:找出前缀和数组中值为 k 的个数;
  • 第三步:前缀和数组中的每位两两相减找出差为 k 的个数;
  • 第四步:返回第二步和第三步找出的数目之和;

class Solution {
    public int subarraySum(int[] nums, int k) {
        int l = 0;
        int r = 0;
        int len = nums.length;
        //用来统计符合题意的数组个数
        int count = 0;
        //利用循环来求出前缀和数组
        for (int i = 0; i < len; i++) {
            if (i != 0) {
                nums[i] = nums[i] + nums[i-1];
            }
            //判断改位是否等于k
            if (nums[i] == k) {
                count++;
            }
        }
        //使前缀和数组中的每位两两相减找出差为 k 的个数
        for (int i = 0; i < len; i++) {
            for (int j = i+1; j < len; j++) {
                if (nums[j] - nums[i] == k) {
                    count++;
                }
            }
        }
        return count;
    }
}

前缀和+哈希表优化:

上面的优化感觉是负优化,但其实是为了这一步做的铺垫我们可以利用公式: Xi - k = Y 来进行优化,Xi 表示前缀和数组的第 i 位;只要我们知道第 i 位之前有多少个值为 Y 的数就行了。所以我们可以引入哈希表来存储第 i 位之前的数;

class Solution {
    public int subarraySum(int[] nums, int k) {
        int count = 0;
        //创建一个哈希表 来存储第 i 位之前的数
        Map<Integer, Integer> hash = new HashMap<>();
        //此处存储一个 0 是必须的,
        //因为有可能第 i 位刚好等于 k;
        hash.put(0, 1);
        //此处利用sum来优化了前缀和数组。
        int sum = 0;
        int len = nums.length;
        for (int i = 0; i < len; i++) {
            //求第i位的前缀和
            sum += nums[i];
            //判断哈希表中是否有符合题意的 Y ;
            //如果没有就将第i位的前缀和放入哈希表
            if (hash.containsKey(sum-k)) {
                int tmp = hash.get(sum-k);
                count += tmp;
            }
            if (hash.containsKey(sum)) {
                int tmp = hash.get(sum);
                hash.put(sum,tmp+1);
            }
            else {
                hash.put(sum,1);
            }
        }
        return count;
    }
}

感谢浏览

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

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

相关文章

ABeam德硕|中国与柴火创客空间达成战略合作,拟定联合发布企业数字化转型实战课程

引言 随着近年数字技术的迅速发展&#xff0c;企业纷纷寻求数字化转型&#xff0c;而数字化转型企业人才的培养正是其中的关键一环。数字化转型人才能够从战略层面把握转型方向&#xff0c;快速适应新技术变革&#xff0c;有效应用技术工具以优化业务流程、提高组织效率、实践创…

如何配置元数据?(如何使用Spring容器)

目录 一、引出问题&#xff08;如何配置元数据&#xff1f;&#xff09;二、没有Spring的时代三、XML配置文件&#xff08;xml配bean&#xff09;1 格式1.1 示例 2 实例化一个Spring容器3 使用Spring容器4 后言 四、基于注解的配置 【[1.9. Annotation-based Container Configu…

代码随想录算法训练营第五十四天|392.判断子序列、115.不同的子序列

392.判断子序列 刷题https://leetcode.cn/problems/is-subsequence/description/文章讲解https://programmercarl.com/0392.%E5%88%A4%E6%96%AD%E5%AD%90%E5%BA%8F%E5%88%97.html视频讲解https://www.bilibili.com/video/BV1tv4y1B7ym/?vd_sourceaf4853e80f89e28094a5fe1e220…

Maven构建项目时,发生依赖下载错误的情况

在使用 Maven 构建项目时&#xff0c;可能会发生依赖下载错误的情况&#xff0c;主要原因有以下几种 1、下载依赖时&#xff0c;出现网络故障&#xff0c;或仓库服务器宕机等原因&#xff0c;导致无法连接至Maven仓库(也就是我们配置的阿里镜像)&#xff0c;从而无法下载依赖 …

国内git最新版本下载链接2.44

git官网地址:Git - Downloading Package (git-scm.com) 蓝奏云: ​​​​​​gGit-2.44.0-64-bit.exe - 蓝奏云 git仓库地址:git/git: Git Source Code Mirror - This is a publish-only repository but pull requests can be turned into patches to the mailing list via …

GPU从虚拟化迈向池化:趋动OrionX产品的创新之路

/ 引言 / 随着人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术的飞速发展&#xff0c;图形处理单元&#xff08;GPU&#xff09;已成为数据中心和云计算环境中的关键资源。GPU的并行处理能力使其成为执行复杂计算任务的理想选择。 然而&#xff…

Docker进阶:Docker-compose 实现服务弹性伸缩

Docker进阶&#xff1a;Docker-compose 实现服务弹性伸缩 一、Docker Compose基础概念1.1 Docker Compose简介1.2 Docker Compose文件结构 二、弹性伸缩的原理和实现步骤2.1 弹性伸缩原理2.2 实现步骤 三、技术实践案例3.1 场景描述3.2 配置Docker Compose文件3.3 使用 docker-…

【vue3学习之路(一)】

文章目录 前言一、vue3项目创建1.1环境准备1.1.1 基于 vue-cli 创建&#xff08;脚手架创建&#xff09;1.1.2 基于 vite 创建&#xff08;推荐&#xff09; 二、熟悉流程总结 前言 参考视频&#xff1a;https://www.bilibili.com/video/BV1Za4y1r7KE?p10&spm_id_frompag…

EFcore的实体类配置

1 约定配置 约定大于配置&#xff0c;框架默认了许多实体类配置的规则&#xff0c;在约定规则不满足要求时&#xff0c;可以显示地定义规则 1 数据库表明在不指定的情况下&#xff0c;默认使用的是数据库上下文类【DBContext】中DbSet 的属性名&#xff1b; 2 数据库表列的名字…

Vue3新手教程

Vue3新手教程 一. Vue3简介1. 性能的提升2.源码的升级3. 拥抱TypeScript4. 新的特性 二. 创建Vue3工程1. 基于 vue-cli 创建2. 基于 vite 创建(推荐)3. 一个简单的效果 三. Vue3核心语法1. OptionsAPI 与 CompositionAPI2. 拉开序幕的 setup2.1 setup 概述2.2 setup 的返回值2.…

【计算机考研】 跨考408全年复习规划+资料分享

跨专业备考计算机考研408&#xff0c;确实是一项挑战。在有限的时间内&#xff0c;我们需要合理安排时间&#xff0c;制定有效的学习计划&#xff0c;做到有效地备考。回顾我之前对408的经验&#xff0c;我想分享一些备考计划和方法。 要认清自己的起点。作为跨专业考生&#…

智能计算模拟: DFT+MD+ML 深度融合及科研实践

第一性原理、分子动力学与机器学习三者的交汇融合已在相关研究领域展现强劲的研究热潮。借助第一性原理计算揭示材料内在的量子特性&#xff0c;并结合分子动力学模拟探究材料在实际环境下的动态行为&#xff1b;运用机器学习算法与上述方法结合&#xff0c;开发高性能预测模型…

GaussDB WDR分析之节点篇与点评分析

今天继续介绍GaussDB的WDR报告&#xff0c;我们今天分析一下CN/DN节点的报告。昨天分析集群报告的时候发现集群报告里缺乏一些DBA分析问题所需要的数据&#xff0c;今天我们来看看是否在节点的报告里能够找到它们。GaussDB的节点报告格式都差不多&#xff0c;只不过CN/DN节点的…

力扣hot100:994. 腐烂的橘子(多源BFS)

这是一个典型的多源BFS问题&#xff0c;如果初学数据结构的同学&#xff0c;可能第一次不能想到&#xff0c;但是如果做过一次应该就能运用了。      主要思路大概是初始时&#xff0c;多个点进入队列然后进行BFS。将某一等价集合视作同一个起始点&#xff08;超级源点&…

阿里二面:Java中锁的分类有哪些?你能说全吗?

引言 在多线程并发编程场景中&#xff0c;锁作为一种至关重要的同步工具&#xff0c;承担着协调多个线程对共享资源访问秩序的任务。其核心作用在于确保在特定时间段内&#xff0c;仅有一个线程能够对资源进行访问或修改操作&#xff0c;从而有效地保护数据的完整性和一致性。…

kvm虚拟化

kvm虚拟化 1. 虚拟化介绍 虚拟化是云计算的基础。简单的说&#xff0c;虚拟化使得在一台物理的服务器上可以跑多台虚拟机&#xff0c;虚拟机共享物理机的 CPU、内存、IO 硬件资源&#xff0c;但逻辑上虚拟机之间是相互隔离的。 物理机我们一般称为宿主机&#xff08;Host&…

arm 外部中断

main.c: #include"key_inc.h" //封装延时函数 void delay(int ms) {int i,j;for(i0;i<ms;i){for(j0;j<2000;j){}} } int main() {//按键中断的初始化key1_it_config();key2_it_config();key3_it_config();while(1){printf("in main pro\n");delay(1…

(人才测评)自媒体运营的招聘入职测评方案

互联网如今发展的如此之快&#xff0c;各种信息爆炸&#xff0c;各种手机游戏量产的时代&#xff0c;除此之外还有一些新兴的岗位诞生&#xff0c;那就是自媒体行业&#xff0c;可以说有了互联网&#xff0c;只要你想做&#xff0c;一个人也可以在网络上发布有趣搞笑的视频&…

WPF使用外部字体,思源黑体,为例子

1.在工程中新建文件夹&#xff0c;命名为“Font"。 2.将下载好的字体文件复制到Font文件夹。 3.在工程中&#xff0c;加入静态资源 <Window.Resources><FontFamily x:Key"SYBold">/AnalyzeImage;Component/Font/#思源黑体 CN Bold</FontFamily…

Ecmascript 和javascript的区别

ECMAScript 是什么&#xff1f; 想象一下&#xff0c;ECMAScript&#xff08;简称ES&#xff09;是个“剧本”&#xff0c;规定了“舞台剧”的基本表演规则和动作。在这个比喻中&#xff0c;“舞台剧”就是我们常说的JavaScript。ECMAScript是由欧洲计算机制造商协会&#xff0…