算法---前缀和练习-2(和为k的子数组)

和为k的子数组

  • [1. 题目解析](#1. 题目解析)
  • [2. 讲解算法原理](#2. 讲解算法原理)
  • [3. 编写代码](#3. 编写代码)

1. 题目解析

题目地址点这里

2. 讲解算法原理

  1. 创建一个无序映射(哈希表) hash,用于统计前缀和的出现次数。初始时,将前缀和为 0 的次数设为 1,表示从数组开头到当前位置的累计和为 0 的子数组个数为 1。

  2. 初始化两个变量 sum 和 ret,分别表示当前的前缀和和满足条件的子数组个数,初始时都设为 0。

  3. 遍历数组 nums 的每个元素 e:

  4. 将 e 加到 sum 中,更新当前的前缀和。

  5. 检查 hash 中是否存在前缀和为 sum - k 的记录,即是否存在一个位置 i,使得从位置 i 到当前位置的子数组的和为 k。如果存在,将 hash[sum - k] 的值累加到 ret 中,表示找到了满足条件的子数组。

  6. 更新 hash[sum],将前缀和 sum 的出现次数加 1。

  7. 完成遍历后,返回 ret,即满足条件的子数组的个数。


3. 编写代码

cpp 复制代码
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int,int> hash;//统计前缀和次数
        hash[0]=1;
        int sum=0,ret=0;
        for(auto e:nums)
        {
            sum+=e;
            if(hash.count(sum-k)) ret+=hash[sum-k];
            hash[sum]++;
        }
        return ret;
    }
};
相关推荐
松涛和鸣1 小时前
14、C 语言进阶:函数指针、typedef、二级指针、const 指针
c语言·开发语言·算法·排序算法·学习方法
yagamiraito_3 小时前
757. 设置交集大小至少为2 (leetcode每日一题)
算法·leetcode·go
星释3 小时前
Rust 练习册 57:阿特巴什密码与字符映射技术
服务器·算法·rust
无敌最俊朗@3 小时前
力扣hot100-141.环形链表
算法·leetcode·链表
实心儿儿5 小时前
C++ —— 模板进阶
开发语言·c++
WWZZ20256 小时前
快速上手大模型:深度学习10(卷积神经网络2、模型训练实践、批量归一化)
人工智能·深度学习·神经网络·算法·机器人·大模型·具身智能
go_bai6 小时前
Linux-线程2
linux·c++·经验分享·笔记·学习方法
sali-tec6 小时前
C# 基于halcon的视觉工作流-章62 点云采样
开发语言·图像处理·人工智能·算法·计算机视觉
fashion 道格7 小时前
用 C 语言玩转归并排序:递归实现的深度解析
数据结构·算法·排序算法
j_xxx404_7 小时前
C++:继承(概念及定义|作用域|基类与派生类转换|默认成员函数|与友元、静态成员关系|多继承|组合)
数据结构·c++