【题目】

给定一个数组arr,和一个整数aim,求在arr中,累加和等于num的最长子数组的长度

例子:

arr = { 7,3,2,1,1,7,7,7 } aim = 7

其中有很多的子数组累加和等于7,但是最长的子数组是{ 3,2,1,1 },所以返回其长度4

【解题】

使用map, 从数组第一个数开始累加, 记录累加和到某个值的第一个位置

map初始存放数据为<0, -1>因为没有一个数字累加的和设置为0,该数字位置为数组的 - 1位置【即数组未开始遍历】

map<sum, index>, 当sum不变时,map不更新!!!

注意:

我们要找的是sum - aim = index == key在map中最早出现的位置,并进行记录

比如:7 3 2 1 1 7 - 6 - 1 7 num == 7

在累积第0个数字 7,sum = 7, sum - aim = 0, map中存在key = 0的位置,最早出现的 位置为 - 1,

说明能组成一个子数组,使得累加和为aim,数组长度为0 - ( - 1) = 1

然后继续向后遍历,当遍历到第4个数字1时,

map记录为{ <0,-1><7,0><10,1><12,2><13,3><14,4> },

此时sum为14, sum - aim = 14 - 7 = 7, key = 7存在map中,最早出现的位置为0,

说明能组成一个子数组,使得累加和为aim,数组长度为4 - (0) = 4

【代码】

  

 #pragma once
#include <iostream>
#include <map>
#include <vector> using namespace std; int mostLongSubArray(vector<int>v, int aim)
{
int res = ;//记录最长记录
map<int, int>m;//记录累加和
m[] = -;//最开始的位置sum为0
int sum = ;
for (int i = ; i < v.size(); ++i)
{
sum += v[i];
if (m.find(sum) == m.end())//累加和不存在
m[sum] = i;
auto ptr = m.find(sum - aim);
if (ptr != m.end())//记录存在
res = res > (i - (ptr->second)) ? res : (i - (ptr->second));//更新子数组最长记录
}
return res;
} void Test()
{
vector<int>v;
v = { ,,,,,,, };
cout << mostLongSubArray(v, ) << endl;
v = { ,,,,,,-,-, };
cout << mostLongSubArray(v, ) << endl;
v = { ,,,,,,,,,,,,, };
cout << mostLongSubArray(v, ) << endl;
}

左神算法进阶班4_2累加和为aim的最长子数组的更多相关文章

  1. 左神算法进阶班8_1数组中累加和小于等于aim的最长子数组

    [题目] 给定一个数组arr,全是正数:一个整数aim,求累加和小于等于aim的,最长子数组,要求额外空间复杂度O(1),时间复杂度O(N) [题解] 使用窗口: 双指针,当sum <= aim ...

  2. 左神算法进阶班1_5BFPRT算法

    在无序数组中找到第k大的数1)分组,每N个数一组,(一般5个一组)2)每组分别进行排序,组间不排序3)将每个组的中位数拿出来,若偶数,则拿上 / 下中位数, 成立一个一个新数组.4)新数组递归调用BF ...

  3. 左神算法进阶班3_1构造数组的MaxTree

    题目 一个数组的MaxTree定义: 数组必须没有重复元素 MaxTree是一棵二叉树,数组的每一个值对应一个二叉树节点 包括MaxTree树在内且在其中的每一棵子树上,值最大的节点都是树的头 给定一 ...

  4. 左神算法进阶班1_4Manacher算法

    #include <iostream> #include <string> using namespace std; //使用manacher算法寻找字符中最长的回文子串 in ...

  5. 左神算法进阶班1_1添加最少字符得到原字符N次

    Problem: 给定一个字符串str1,只能往str1的后面添加字符变成str2. 要求1:str2必须包含两个str1,两个str1可以有重合,但是不能以同一个位置开头. 要求2:str2尽量短最 ...

  6. 左神算法进阶班5_4设计可以变更的缓存结构(LRU)

    [题目] 设计一种缓存结构,该结构在构造时确定大小,假设大小为K,并有两个功能: set(key, value):将记录(key, value)插入该结构. get(key):返回key对应的valu ...

  7. 左神算法进阶班6_1LFU缓存实现

    [题目] LFU也是一个著名的缓存算法,自行了解之后实现LFU中的set 和 get 要求:两个方法的时间复杂度都为O(1) [题解] LFU算法与LRU算法很像 但LRU是最新使用的排在使用频率最前 ...

  8. 左神算法基础班4_1&2实现二叉树的先序、中序、后序遍历,包括递归方式和非递归

    Problem: 实现二叉树的先序.中序.后序遍历,包括递归方式和非递归方式 Solution: 切记递归规则: 先遍历根节点,然后是左孩子,右孩子, 根据不同的打印位置来确定中序.前序.后续遍历. ...

  9. 左神算法基础班5_1设计RandomPool结构

    Problem: 设计RandomPool结构 [题目] 设计一种结构,在该结构中有如下三个功能: insert(key):将某个key加入到该结构,做到不重复加入. delete(key):将原本在 ...

随机推荐

  1. JDBC_入门及注入问题

    .JDBC基本概念: java database Connectivity java数据库连接,java语言操作数据库 本质: 官方定义的一套操作所有关系型数据库的规则,即接口. 各个数据库厂商实现这 ...

  2. python库之sklearn

     一.安装sklearn conda install scikit-learn 参考文献 [1]整体介绍sklearn https://blog.csdn.net/u014248127/article ...

  3. 用于扩展目标跟踪的笛卡尔B-Spline车辆模型

    (哥廷根大学) 摘要 文章提出了一种表示空间扩展物体轮廓的新方法,该方法适用于采用激光雷达跟踪未知尺寸和方向的车辆.我们在笛卡尔坐标系中使用二次均匀周期的B-Splines直接表示目标的星 - 凸形状 ...

  4. Bootstrap 附加导航(Affix)插件

    附加导航(Affix)插件允许指定 <div> 固定在页面的某个位置.一个常见的例子是社交图标.它们将在某个位置开始,但当页面点击某个标记,该 <div> 会锁定在某个位置,不 ...

  5. java哈希表(线性探测哈希表。链式哈希表)

    哈希表(散列表) 通过哈希函数使元素的存储位置与它 的关键码之间能够建立一一映射的关系,在查找时可以很快找到该元素. 哈希表hash table(key,value) 的做法其实很简单,就是把Key通 ...

  6. gevent实现并发

    #_author:来童星#date:2019/12/12import geventimport timedef func1(): print('\033[31;1mfun1 starting...\0 ...

  7. SpringCloudBus

    不重启微服务的情况下更新配置 配置服务端 tensquare_config配置依赖 <dependency> <groupId>org.springframework.clou ...

  8. Jmeter接口自动化测试:简单使用步骤

    好处:不需要页面就可以提前介入测试,实施成本低,修改量少,相对于UI自动化来说更为稳定 1. 下载略过 2. 使用步骤 创建线程组合控制器(Jmeter基本操作) 针对http协议的接口增加Sampl ...

  9. jquery学习笔记(二):DOM元素操作

    内容来自[汇智网]jquery学习课程 2.1 元素属性操作 1.获取元素的属性 语法:attr(name) 参数name表示属性的名称 2.设置元素的属性 单个属性设置语法:attr(key,val ...

  10. 如何区分无线AP跟无线路由器

    无线AP是一个无线网络的接入点,俗称“热点”.主要有路由交换接入一体设备和纯接入点设备,一体设备执行接入和路由工作,纯接入设备只负责无线客户端的接入,纯接入设备通常作为无线网络扩展使用,与其他AP或者 ...