前缀和+哈希表——560. 和为 K 的子数组

在这里插入图片描述

文章目录

    • 🪐1. 题目
    • 🌟2. 算法原理
      • ⭐解法一:暴力枚举
      • ⭐解法二:前缀和+哈希表
    • 🌞3. 代码实现

🪐1. 题目

题目链接: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

🌟2. 算法原理

这题要找的是连续的子数组,例如:

image-20231125133959570

⭐解法一:暴力枚举

固定一个位置,找到一个符合条件的ret++,当然了,这里还不能停,继续往后变量,直到数组结尾处,这个时间复杂度为O(n2)。
在这里插入图片描述

⭐解法二:前缀和+哈希表

在暴力枚举的过程中,这里固定的位置和往后遍历,虽然两个指针方向是一样的,但是不能使用滑动窗口,因为这个数组里面有负数0,并不是单调递增或者单调递减的,这样就会导致漏掉一些情况。

我们固定一个位置,往前遍历它的所有子数组,也可以理解为固定一个i位置,以i为结尾的所有子数组。
在这里插入图片描述

当枚举到i位置的时候,想找和为k的子数组就可以转换为在[0,i-1]区间内,有多少个前缀和为dp[i] - k的子数组。

image-20231125140600059

我们把前缀和数组处理出来之后,要找i位置之前有多少个和为dp[i]-k,不能又从头到尾遍历,这样的时间复杂度还不如暴力求解

因此我们可以用哈希表,来快速找到在i之前有多少个前缀和是等于dp[i]-k的。那么哈希表里面的映射关系是前缀和出现的次数
在这里插入图片描述

细节问题:

  • 前缀和加入哈希表的时机:不能一股脑将前缀和全部丢进哈希表,我们只需要计算在i位置之前,哈希表里面只保存[0,i-1]位置的前缀和。
  • 不用真正的创建一个前缀和数组,只需借助一个临时变量,记录这个位置之前的前缀和,计算完毕之后,再更新一下这个临时变量。
  • 当整个前缀和为k时,我们需要在哈希表中默认有一个前缀和为0的位置hash[0]=1,以防这个情况被忽略。
    image-20231125141827462

此算法的时间复杂度为O(n)

🌞3. 代码实现

class Solution {
public:int subarraySum(vector<int>& nums, int k){unordered_map<int,int> hash;hash[0] = 1;int dp = 0;int ret = 0;for(auto e:nums){dp+=e; //当前位置的前缀和if(hash.count(dp-k))    //在这个位置之前,有多少个前缀和为dp-k的ret+=hash[dp-k];hash[dp]++; }return ret;}
};

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

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

相关文章

python与C++与TensorRT的绑定

绑定的起因 Jetpack中的TensorRT不能直接在python3.8环境中使用,所以我们需要对TensorRT利用pybind11对python相进性绑定。 绑定的官方链接如下:点击这里 这个是8.2版本的,你可以使用其他版本也是可以的。 整个过程可以在虚拟环境中完成,主要是想最后的whl文件 在Jetson…

基于springboot实现高校食堂移动预约点餐系统【项目源码】

基于springboot实现高校食堂移动预约点餐系统演示 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备…

数组题目: 665. 非递减数列、453. 最小移动次数使数组元素相等、283. 移动零、189. 旋转数组、396. 旋转函数

665. 非递减数列 题解&#xff1a; 题目要求一个非递减数列&#xff0c;我们可以考虑需要更改的情况&#xff1a; nums {4, 2, 5} 对于这个nums&#xff0c;由于2的出现导致非递减&#xff0c;更改的情况就是要么4调到<2&#xff0c;要么2调到4,5. nums {1, 4, 2, 5} …

P10 C++类和结构体的区别

目录 01 前言 02 struct 与 class格式上的区别 03 struct 与 class 使用上的区别 04 常用的代码风格 01 前言 今天这期我们主要解决一个问题&#xff0c;就是 C 中的类和结构体有什么区别。 本期我们有两个术语&#xff0c;结构体 struct&#xff0c;它是 structure 的缩写…

一篇文章让你入门python集合和字典

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一、集合: 增加 add 删除 del 删除集合 discard(常用)删除集合中的元素 &#xff0c;删除一个不存在的元素不会报错 remove 删除一个不存在的元素会报错 pop随…

每日一题 1457. 二叉树中的伪回文路径(中等,DFS)

一句话&#xff0c;深度搜索所有路径&#xff0c;判断路径是否伪回文 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right clas…

【Linux】常见指令及周边知识(一)

【Linux】常见指令及周边知识&#xff08;一&#xff09; 一、初始Linux操作系统1.Linux背景2.如何使用Linux 二、学习Linux之前的预备周边知识&#xff08;重点&#xff09;&#xff1a;1.什么叫做文件&#xff1f;2. Linux下的路径分隔符3.在Linux中为什么会存在路径&#xf…

Leetcode—266.回文排列【简单】Plus

2023每日刷题&#xff08;四十&#xff09; Leetcode—266.回文排列 C语言实现代码 char chara[26] {0};int calculate(char *arr) {int nums 0;for(int i 0; i < 26; i) {nums arr[i];}return nums; }bool canPermutePalindrome(char* s) {int len strlen(s);for(in…

软件测试 | MySQL 非空约束详解

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

MYSQL基础知识之【创建,删除,选择数据库】

文章目录 前言MySQL 创建数据库使用 mysqladmin 创建数据库使用 PHP脚本 创建数据库 MySQL 删除数据库使用 mysqladmin 删除数据库使用PHP脚本删除数据库 MySQL 选择数据库从命令提示窗口中选择MySQL数据库使用PHP脚本选择MySQL数据库 后言 前言 hello world欢迎来到前端的新世…

ssm+vue的物资物流系统的设计与实现(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的物资物流系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体…