当前位置: 首页 > news >正文

算法与数据结构(和为K的子数组)

题目

思路

前缀和+哈希表

这里引入了一个前缀和的概念。什么是前缀和呢?对于数组中的任意位置i,前缀和sum[i]为从第一个元素到第i个元素的元素和。这说明你要是想求第i+1到第j的子数组和,可以用sum[j]-sum[i]来计算。

我们可以用哈希表来存储每个位置的前缀和以及它出现的次数。

关键点说明

sum-k的意义:如果在hashmap中找到了sum-k,则说明在之前某个点的累计和为sum-k,而当前点的累积和是sum,则说明之前的点到当前点的子数组之和恰好为k =sum-(sum-k)。

如何去利用这个条件呢?

如果sum-k在哈希表中,则sum-k出现的次数为从不同起点到当前节点子数组和为k的不同情况。每个sum-k都对应一个起点,使得从那个起点到当前节点的和为k。

因此,每当我们找到一个 sum - k 存在于哈希表中时,我们就把它的计数(即之前这种情况发生的次数)加到 count 上,这表示我们又找到了相应数量的以当前元素结束的子数组,其和为 k。

为什么要定义hashmap[0]=1,如果sum-k等于0,说明存在子数组的和等于k,直接给次数+1即可。

代码

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) 
    {
           unordered_map<int,int> hashmap;
           int sum=0,count=0;
           hashmap[0] = 1;
           for(int i=0;i<nums.size();i++)
           {
                sum += nums[i];
                if(hashmap.find(sum-k) != hashmap.end())
                {
                    count += hashmap[sum-k];
                }
                hashmap[sum]++;
           }
           return count;
    }
};

相关文章:

  • 深入解析 .NET 中的依赖项加载机制:原理、实现与最佳实践
  • 一人系统 之 为什么要做一人系统?
  • 认知突破、执行闭环与生态创新:DeepSeek、Manus与Coze的AI应用
  • 爬虫案例-爬取某站视频
  • Lua 的 Neovim 常用配置
  • Vue3 组件通信 $refs $parent
  • 【React】使用Swiper报错`Swiper` needs at least one child
  • 前端会话控制技术:cookie/session/token
  • 特斯拉Optimus 2.0:多模态感知与强化学习引领家庭场景变革
  • 【递归、搜索和回溯算法】专题三 :穷举VS暴搜VS深搜VS回溯VS剪枝
  • WebGL图形编程实战【2】:动态着色 × 纹理贴图技术揭秘
  • 学习Flutter:搭建第一个 Flutter 应用
  • StarRocks 主键(Primary Key)深度解析
  • MATLAB+Arduino控制小车直行+转向
  • 竞赛团队招募系统----山东大学web课程设计
  • cool-admin-midway 使用腾讯云cos上传图片
  • SAP SD学习笔记35 - ATP(可用性检查)的各种Pattern
  • NLP高频面试题(十二)——Lora微调的原理、什么是Qlora
  • AWS NoSQL解决方案全景图
  • 【MySQL笔记】数据类型
  • 横跨万里穿越百年,《受到召唤·敦煌》中张艺兴一人分饰两角
  • 落实中美经贸高层会谈重要共识,中方调整对美加征关税措施
  • 王毅谈中拉论坛十年成果
  • 美国拟向阿联酋和沙特AI公司出口数十万枚芯片
  • 匈牙利史专家阚思静逝世,享年87岁
  • 2025年两岸关系研讨会在上海开幕