子串 前缀和 | Java | (hot100) 力扣560. 和为K的子数组

news2024/11/15 9:59:01

560. 和为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 sum=0;
            for(int j=i; j<len; j++) {
                sum+=nums[j];
                if(sum == k) {
                    count++;
                }
            }
        }
        return count;
    }
}
  • 力扣官方
    在这里插入图片描述

前缀和 + 哈希表优化

  • 前缀和 基础知识

前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和
首先做一个预处理,定义一个sum[]数组,sum[i]代表a数组中前i个数的和。 sum[r+1]-sum[l]就是【L,R】的区间和

sum[r] = a[1] + a[2] + a[3] + a[l-1] + a[l] + a[l + 1] ...... a[r];
sum[l - 1] = a[1] + a[2] + a[3] + a[l - 1];
sum[r] - sum[l - 1] = a[l] + a[l + 1] + ......+ a[r];
  • 本题前缀和的使用

通过计算前缀和,我们可以将问题转化为求解两个前缀和之差等于k的情况。

通过遍历数组,计算每个位置的前缀和,并使用一个哈希表来存储每个前缀和出现的次数。在遍历的过程中,我们检查是否存在prefixSum[j] - k的前缀和,如果存在,说明从某个位置到当前位置的连续子数组的和为k, 我们将对应的次数累加到结果中。

这样,通过遍历一次数组,我们可以统计出和为k的连续子数组的个数,并且时间复杂度为O(n),其中n为数组的长度。

实际做题的时候prefixSum[i]不一定只能表示下标为 0 - i-1 的数组元素和,也可以表示 0-i 。本题就是表示 0-i。

  • preSum[]数组
class Solution {
    public int subarraySum(int[] nums, int k) {
        int[]preSum = new int[nums.length]; 
        preSum[0] = nums[0];
        int count=0;
        HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
        map.put(0,1);
        for(int i=0; i<nums.length; i++) {
            if(i!=0) preSum[i] = preSum[i-1]+nums[i];

            int pre = preSum[i];
            if(map.containsKey(pre-k)) {
                count += map.get(pre-k);
            }
            map.put(pre, map.getOrDefault(pre,0)+1);
        }
        return count;
    }
}

【重要】if(map.containsKey(pre-k)) :是否存在prefixSum[j] - k的前缀和,如果存在,说明从某个位置到当前位置的连续子数组的和为k

map: <前缀和,数量> // 初始化前缀和为0的次数为1

  • 本题也可以不使用数组
public class Solution {
    public int subarraySum(int[] nums, int k) {
        int count = 0, pre = 0;
        HashMap < Integer, Integer > mp = new HashMap < > ();
        mp.put(0, 1);
        for (int i = 0; i < nums.length; i++) {
            pre += nums[i];
            if (mp.containsKey(pre - k)) {
                count += mp.get(pre - k);
            }
            mp.put(pre, mp.getOrDefault(pre, 0) + 1);
        }
        return count;
    }
}

作者:力扣官方题解

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

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

相关文章

C/C++复习 day2(模板,继承,多态)

C/C复习 day2 文章目录 C/C复习 day2前言一、模板1.模板的原理2.非类型模板参数3.模板的特化a. 函数模板的特化b. 类模板的特化1.全特化2.偏特化 4.模板的分离编译 二、继承1.继承的概念2.继承与派生类对象赋值转化3.隐藏1.成员变量的隐藏2. 成员函数的隐藏 4.继承中的友元5.继…

数据结构:栈(含源码)

目录 一、栈的概念和结构 二、栈的实现 2.1 头文件 2.2 各个功能的实现 初始化栈 入栈 出栈 获取栈顶元素和栈中有效个数 判断栈是否为空 栈的销毁 2.3 测试 完整源码 一、栈的概念和结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和…

[C++][opencv]基于opencv实现photoshop算法图像剪切

【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 //图像剪切 //参数&#xff1a;src为源图像&#xff0c; dst为结果图像, rect为剪切区域 //返回值&#xff1a;返回0表示成功&#xff0c;否则返回错误代码 int imageCrop(InputArray src, OutputArray dst,…

遥感影像-语义分割数据集:sar水体数据集详细介绍及训练样本处理流程

原始数据集详情 简介&#xff1a;该数据集由WHU-OPT-SAR数据集整理而来&#xff0c;覆盖面积51448.56公里&#xff0c;分辨率为5米。据我们所知&#xff0c;WHU-OPT-SAR是第一个也是最大的土地利用分类数据集&#xff0c;它融合了高分辨率光学和SAR图像&#xff0c;并进行了充…

Chromium编译指南2024 -Android篇:安装其他常用软件(三)

1.引言 在前面的章节中&#xff0c;我们详细讲解了编译 Chromium for Android 所需的系统和硬件要求&#xff0c;并介绍了如何配置开发环境&#xff0c;包括更改软件源和安装基本依赖。在完成这些基础配置之后&#xff0c;为了进一步提升开发和编译效率&#xff0c;您可能还需…

【Hot100】LeetCode—438. 找到字符串中所有字母异位词

目录 1- 思路哈希表 滑动窗口 2- 实现⭐438. 找到字符串中所有字母异位词——题解思路 3- ACM 实现 原题链接&#xff1a;438. 找到字符串中所有字母异位词 1- 思路 哈希表 滑动窗口 思路 哈希表&#xff1a;通过数组维护一个哈希表滑动窗口&#xff1a;通过控制数组的下标…

为何说本届巴黎奥运会中国金牌榜应排列第一?

为何说本届巴黎奥运会中国金牌榜应排列第一&#xff1f; 在奥运会上&#xff0c;金牌榜的排名一直是各国关注的焦点。然而&#xff0c;在历届奥运会中&#xff0c;关于金牌榜的统计方法和排名标准却存在一定的争议。尤其在中美两国之间&#xff0c;金牌榜的排名往往成为双方媒体…

制作好的excel报表设置打开密码或忘记密码怎么办?

excel工作表经常用来做数据统计、工资、报表等的文件格式&#xff0c;这些类型的文件都是很重要的数据资料&#xff0c;为此做这些数据的朋友们都会给他设置一个打开密码&#xff0c;不让其他人随便打开。但随着时间的流逝&#xff0c;我们做的数据报表越来越多了&#xff0c;做…

transformer(李宏毅老师系列)

自学参考&#xff1a; Transformer:Attention Is All You Need Transformer论文逐段精读 视频课 课件资料 笔记 一、引入 seq2seq&#xff1a;输入一个序列的向量作为input&#xff0c;output的长度由机器自己决定seq2seq model应用: 语音辨识 输入是声音讯号的一串vector 输出…

提高清晰度的全彩LED显示屏的关键要素

全彩LED显示屏作为现代广告宣传和信息传播的主要媒介&#xff0c;其清晰度在很大程度上决定了观众的视觉体验和信息传达的效果。随着人们对高清显示需求的不断提升&#xff0c;全彩LED显示屏也在向更高清、更细腻的显示效果迈进。那么&#xff0c;如何进一步提升全彩LED显示屏的…

6数字基石:掌握计算机语言、多媒体与系统工程

计算机语言 计算机语言是指用于人与计算机之间交流的一种语言&#xff0c;是人与计算机之间传递信息的媒介。计算机语言主要由一套指令组成&#xff0c;而这一种指令一般包括表达式、流程控制和集合三大部分内容。 表达式又包含变量、常量、字面量和运算符。 流程控制有分支…

善用 AI ,优化项目,保姆级简历写作指南第七弹

大家好&#xff0c;我是程序员鱼皮。做知识分享这些年来&#xff0c;我看过太多简历、也帮忙修改过很多的简历&#xff0c;发现很多同学是完全不会写简历的、会犯很多常见的问题&#xff0c;不能把自己的优势充分展示出来&#xff0c;导致错失了很多面试机会&#xff0c;实在是…

如何将TRIZ的“最终理想解”应用到机器人电机控制设计中?

TRIZ理论&#xff0c;作为一套系统的创新方法论&#xff0c;旨在帮助设计师和工程师突破思维惯性&#xff0c;解决复杂的技术难题。其核心思想之一便是“最终理想解”&#xff0c;它如同一盏明灯&#xff0c;指引着我们在技术创新的道路上不断前行。最终理想解追求的是产品或技…

“听到“温度 - 科学家发现人类感知的新层次

雷克曼大学&#xff08;IDC Herzliya&#xff09;伊夫切尔大脑、认知与技术研究所&#xff08;BCT Institute&#xff09;的研究人员发现了一种在很大程度上被忽视的感知能力&#xff0c;他们利用机器学习揭示了跨模态感知–不同感官模态之间的相互作用–的动态。在最近的一项研…

【HarmonyOS NEXT星河版开发学习】小型测试案例06-小红书卡片

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面&#xff08;暂未发布&#xff09; 前言 在鸿蒙&#xff08;HarmonyOS&#xff09;开发中&#xff0c;自适应伸缩是指应用程序能够根据不同设备的屏幕尺寸、分辨率和形态&…

2-63 基于matlab的GMPHD滤波器算法

基于matlab的GMPHD滤波器算法&#xff08;1&#xff09;本次仿真采用线性CV模型&#xff1b;&#xff08;2&#xff09;观测模型为线性条件下&#xff0c;观测值为X&#xff0c;Y轴坐标&#xff1b;&#xff08;3&#xff09;验证GMPHD算法对多目标跟踪的有效性&#xff1b;输出…

对于产品设计方面来说,3D 技术的应用有哪些优势?

3D技术在产品设计方面提供了许多优势&#xff0c;主要体现在以下几个方面&#xff1a; 1、可视化&#xff1a;设计师利用3D技术创建产品三维模型&#xff0c;使得产品在设计阶段就能被可视化&#xff0c;帮助团队更好地理解产品的外观和功能。 2、精确性&#xff1a;3D模型可…

人人都能搞定的大模型原理 - 神经网络

人工智能的发展起步于1950年&#xff0c;期间经历了各种里程碑和变革&#xff0c;与此相关的神经网络技术也从最初的单层感知到复杂的层级和卷积神经网络一路创新和变革&#xff0c;不断推动人工智能领域的发展&#xff0c;直到 2022 年 ChatGPT 的问世&#xff0c;彻底引爆了…

Leetcode174.地下城游戏

题目 代码&#xff08;首刷看解析 2024年5月6日&#xff09; class Solution { public:// 动态规划int calculateMinimumHP(vector<vector<int>>& dungeon) {// dp[i][j]从(i,j)出发&#xff0c;到达终点所需要的最少血量int m dungeon.size();int n dungeo…

【1.9】动态规划-解单词拆分

一、题目 给定一个非空字符串s和一个包含非空单词的列表wordDict&#xff0c;判定s是否可以被空格拆分为一个或多个在字典中出现的单词。 说明&#xff1a; 1. 拆分时可以重复使用字典中的单词。 2. 你可以假设字典中没有重复的单词。 示例1&#xff1a; 示例2&#xff1a;…