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

力扣hot100:560.和为K的子数组(前缀和+哈希表)

分析:

        这个题目乍一看,数据大小用暴力解法大概率会超时,可能想用双指针,但是问题出现在 可能存在负数,也就是说即使是找到了一个答案,后面也可能存在负数和正数抵消,又是答案,因此不太行。

        那如何想到前缀和的呢? (我做的时候只能说灵光乍现,我也记不起来怎么想到的)

        也许是因为,这里相当于是求 和为k的区间 个数,能快速求出区间和的就是前缀和了,拿到前缀和之后,对于任何一个sum[i](0~i的和),如何求得sum[i]-sum[j]=k?实际上我们发现 值sum[j] 是确定的!因此我们可以用哈希表保存之前 前缀和为sum[j]的值的个数,并且这个哈希表只随着遍历进行保存(即对于每一个sum[i] 只会保存sum[i]之前的 前缀和)。

前缀和+哈希表

class Solution {
public:int subarraySum(vector<int>& nums, int k) {//前缀和+双指针vector<int> sum(nums.size());unordered_map<int,int> hmap;hmap[0]=1;//总和为0的情况 不加入元素时就有一种情况。long long ans=0;for(int i=0;i<nums.size();++i){if(i==0) sum[i]=nums[i];else sum[i]=sum[i-1]+nums[i];if(hmap.find(sum[i]-k)!=hmap.end()){//查看sum[i]-k在之前出现过没,如果出现过,则答案包含这个ans+=hmap[sum[i]-k];//sum[i]-sum[j]=k;}hmap[sum[i]]+=1;}return ans;}
};

空间优化:

class Solution {
public:int subarraySum(vector<int>& nums, int k) {//前缀和+双指针int sum=0;unordered_map<int,int> hmap;hmap[0]=1;//总和为0的情况 一开始就有long long ans=0;for(int i=0;i<nums.size();++i){sum+=nums[i];if(hmap.find(sum-k)!=hmap.end()){//查看k-sum[i]在之前出现过没,如果出现过,则答案包含这个ans+=hmap[sum-k];//sum[i]-sum[j]=k;}hmap[sum]+=1;}return ans;}
};

相关文章:

  • 基于Mindspore,通过Resnet50迁移学习实现猫十二分类
  • 【C++】类的默认成员函数(上)
  • 【S32DS报错】-8-调用初始化函数Port_Init后,S32DS断开与调试器PEmicro/J-Link的连接,无法调试Debug(基于MCAL)
  • 【conda】实现conda环境迁移的4种方式
  • 数字孪生10个技术栈:数据采集的八种方式
  • CL/opencl.h: No such file or directory(CentOS8 QT5.12.12)
  • Spring容器的启动流程
  • 如何在Word里一次性给全部汉字加拼音?
  • 艺术与科技的结合,AI绘画图生图怎么样?
  • 【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 4
  • JavaWeb环境配置 IDE2022版
  • nginx作为tcp的负载均衡
  • 从mysql 数据库表导入数据到elasticSearch的几种方式
  • [动态规划][蓝桥杯 2022 省 B] 李白打酒加强版 -- 代码注释含详解
  • gdb 调试,给 scanf 传入不可见字符
  • python3.6+scrapy+mysql 爬虫实战
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Angular 响应式表单 基础例子
  • CentOS 7 修改主机名
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Iterator 和 for...of 循环
  • javascript从右向左截取指定位数字符的3种方法
  • js递归,无限分级树形折叠菜单
  • JS基础之数据类型、对象、原型、原型链、继承
  • Leetcode 27 Remove Element
  • PHP 7 修改了什么呢 -- 2
  • Spring声明式事务管理之一:五大属性分析
  • storm drpc实例
  • 初探 Vue 生命周期和钩子函数
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 分布式任务队列Celery
  • 浮动相关
  • 工程优化暨babel升级小记
  • 关于Java中分层中遇到的一些问题
  • 算法---两个栈实现一个队列
  • 算法系列——算法入门之递归分而治之思想的实现
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 做一名精致的JavaScripter 01:JavaScript简介
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • PostgreSQL之连接数修改
  • scrapy中间件源码分析及常用中间件大全
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​​​​​​​​​​​​​​Γ函数
  • #{} 和 ${}区别
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (剑指Offer)面试题34:丑数
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (一)kafka实战——kafka源码编译启动
  • (转)Oracle 9i 数据库设计指引全集(1)