左神算法进阶班4_2累加和为aim的最长子数组
【题目】
给定一个数组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的最长子数组的更多相关文章
- 左神算法进阶班8_1数组中累加和小于等于aim的最长子数组
[题目] 给定一个数组arr,全是正数:一个整数aim,求累加和小于等于aim的,最长子数组,要求额外空间复杂度O(1),时间复杂度O(N) [题解] 使用窗口: 双指针,当sum <= aim ...
- 左神算法进阶班1_5BFPRT算法
在无序数组中找到第k大的数1)分组,每N个数一组,(一般5个一组)2)每组分别进行排序,组间不排序3)将每个组的中位数拿出来,若偶数,则拿上 / 下中位数, 成立一个一个新数组.4)新数组递归调用BF ...
- 左神算法进阶班3_1构造数组的MaxTree
题目 一个数组的MaxTree定义: 数组必须没有重复元素 MaxTree是一棵二叉树,数组的每一个值对应一个二叉树节点 包括MaxTree树在内且在其中的每一棵子树上,值最大的节点都是树的头 给定一 ...
- 左神算法进阶班1_4Manacher算法
#include <iostream> #include <string> using namespace std; //使用manacher算法寻找字符中最长的回文子串 in ...
- 左神算法进阶班1_1添加最少字符得到原字符N次
Problem: 给定一个字符串str1,只能往str1的后面添加字符变成str2. 要求1:str2必须包含两个str1,两个str1可以有重合,但是不能以同一个位置开头. 要求2:str2尽量短最 ...
- 左神算法进阶班5_4设计可以变更的缓存结构(LRU)
[题目] 设计一种缓存结构,该结构在构造时确定大小,假设大小为K,并有两个功能: set(key, value):将记录(key, value)插入该结构. get(key):返回key对应的valu ...
- 左神算法进阶班6_1LFU缓存实现
[题目] LFU也是一个著名的缓存算法,自行了解之后实现LFU中的set 和 get 要求:两个方法的时间复杂度都为O(1) [题解] LFU算法与LRU算法很像 但LRU是最新使用的排在使用频率最前 ...
- 左神算法基础班4_1&2实现二叉树的先序、中序、后序遍历,包括递归方式和非递归
Problem: 实现二叉树的先序.中序.后序遍历,包括递归方式和非递归方式 Solution: 切记递归规则: 先遍历根节点,然后是左孩子,右孩子, 根据不同的打印位置来确定中序.前序.后续遍历. ...
- 左神算法基础班5_1设计RandomPool结构
Problem: 设计RandomPool结构 [题目] 设计一种结构,在该结构中有如下三个功能: insert(key):将某个key加入到该结构,做到不重复加入. delete(key):将原本在 ...
随机推荐
- Web介绍
web概念概述 javaWeb: 使用java语言开发基于互联网的项目 软件架构: 1.C/S:Client/Server 客户端/服务器端 2.B/S:Browser/Server 浏览器/服务器端 ...
- spring MVC 全局的异常处理
1.使用SimpleMappingExceptionResolver实现异常处理 在Spring的配置文件applicationContext.xml中增加以下内容: <bean class=& ...
- Apache Spark 2.2.0 中文文档 - Spark Streaming 编程指南
Spark Streaming 编程指南 概述 一个入门示例 基础概念 依赖 初始化 StreamingContext Discretized Streams (DStreams)(离散化流) Inp ...
- ARM GNU 专有符号
1. @ 表示注释从当前位置到行尾的字符. 2. # 注释掉一整行. 3. ; 新行分隔符.
- 自动化测试之sikuli调研
调研结果 Sikuli可用于web和app的自动化测试中,操作简单,代码容易,但截图过程太过繁琐,所需要的图片内存占用量大,且sikuli的图片识别度较低,需对所要操作的图片进行精准截图. 什么是Si ...
- 双十一HostGator独立服务器方案
一年一度的“双十一”购物狂欢节到来,各大电商平台线上消费的各种“吸金”开启了“双十一”模式,一年一度的“双十一”网购狂欢又开始以“巨大的价格优势”来勾起消费者的购买欲望. 此次双十一期间,HostGa ...
- sql (9) COUNT
COUNT() 函数返回匹配指定条件的行数.语法SQL COUNT(column_name) 语法COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):新建表 Stude ...
- 【转载】OpenCL实现矩阵相乘
矩阵相乘其实就是前一个矩阵的每一行乘以后一个矩阵的每一列,然后将乘后的每一个数字相加,得到结果矩阵的指定位置的数值.具体算法回顾一下线性代数即可.但是这种行列相乘其实都是独立的,如果是CPU计算必须串 ...
- 20170702-变量说明,静态方法,类方法区别,断点调试,fork,yield协程,进程,动态添加属性等。。
概念: 并行:同时运行 并发:看似同时运行 json后任然中文的问题 import json d = {"名字":"初恋这件小事"} new_d1 = jso ...
- hdu多校第四场 1007 (hdu6620) Just an Old Puzzle 逆序对
题意: 给你一个数字拼图,问你数字拼图能否能复原成原来的样子. 题解: 数字拼图的性质是,逆序数奇偶相同时,可以互相转化,逆序数奇偶不同,不能互相转化. 因此统计逆序对即可. #include< ...