【题目】

给定一个数组arr,全是正数;一个整数aim,求累加和小于等于aim的,最长子数组,要求额外空间复杂度O(1),时间复杂度O(N)

【题解】

使用窗口:

双指针,当sum <= aim,,R->, 当sum > aim, L->记录最大的R - L即可

【进阶】

给定一个数组arr,值可正,可负,可0;一个整数aim,求累加和小于等于aim的,最长子数组,要求时间复杂度O(N)

【题解】

之所以比原题更难,是因为负数可以使得整个子数组开始的和很大,但加到负数时,整体和就变小了

借助两个数组

min_sum[] //min_sum[i] == 即必须以i开头的数组的最小累积和

min_sum_index[]// min_sum_index[i] == 即以i开头数组的最小累加和的达到的最右端位置

技巧:

从数组的后向前算:

当n位置的最小累加和为负数时,那么n - 1的最小累加和一定是自己加上n的最小累加和,其最右边界与n相同

当n位置的最小累加和为正数时,那么n - 1的最小累加和一定是自己,因为再向后面加也是加一个正数,其最右边界就是自己的位置

求解:

从第0个数开始,R直接到0位置的最右边界,sum + 0位置的最小累加和,若,sum<aim, 则再加入R位置的最小累加和,并且R移到R位置的最右边界
直至sum>aim,则可以知道最长数组是多少了

【代码】

 #pragma once
#include <iostream>
#include <vector> using namespace std; int theLongestArray(vector<int>v, int aim)
{
//使用两个指针,作为窗口的左右端
int l = -;
int r = ;
int sum = ;
int res = ;
for (; r < v.size(); ++r)
{
sum += v[r];
while (sum > aim && l < r)//向右移动窗口
{
++l;
sum -= v[l];
}
res = res > (r - l) ? res : (r - l);
}
return res;
} int theLongestArray_2(vector<int>v, int aim)
{
int* min_sum = new int[v.size()];//以i开头的数组的最小和
int* min_sum_index = new int[v.size()];//以i开头的数组的最小和数组右端
for (int i = v.size()-; i >= ; --i)
{
if (i + < v.size() && min_sum[i + ] < )//右端最小和为负数,则可加上自己比自己更小
{
min_sum[i] = min_sum[i + ] + v[i];
min_sum_index[i] = min_sum_index[i + ];
}
else//右端为整数,加上自己比自己大,那么就以自己为最小的数组和
{
min_sum[i] = v[i];
min_sum_index[i] = i;
}
}
//定义窗口的左右边界
int l = -;
int r = ;
int res = ;
int sum = ;
for (int i=;i<v.size();++i)
{
sum += min_sum[i];
r = min_sum_index[i];
while (l<r && sum>aim)
{
++l;
sum -= v[l];
}
res = res > (r - l) ? res : (r - l);
}
delete[]min_sum;
delete[]min_sum_index;
return res; }
void Test()
{
vector<int>v;
v = {,,,,,,,,,,,,,,};
cout << theLongestArray(v, ) << endl;
v = { ,,,,,,,-,,,,,,,,,,,-};
cout << theLongestArray_2(v, ) << endl;
}

左神算法进阶班8_1数组中累加和小于等于aim的最长子数组的更多相关文章

  1. 数组中累加和小于等于k的最长子数组

    问题描述: 给定一个无序数组arr,其中元素可正.可负.可0,给定一个整数 k.求arr所有的子数组中累加和小于或等于k的最长子数组长度.例如:arr=[3,-2,-4,0,6],k=-2,相加和小于 ...

  2. 左神算法进阶班4_2累加和为aim的最长子数组

    [题目] 给定一个数组arr,和一个整数aim,求在arr中,累加和等于num的最长子数组的长度 例子: arr = { 7,3,2,1,1,7,7,7 } aim = 7 其中有很多的子数组累加和等 ...

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

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

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

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

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

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

  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. 左神算法进阶班1_1添加最少字符得到原字符N次

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

  9. 数组中累加和为k的最大子数组的长度

    package com.hzins.suanfa; import java.util.HashMap; public class demo { /** * 数组中累加和为k的最大子数组的长度 * @p ...

随机推荐

  1. Spring MVC @RequestParam(5)

    案例来说明 1 @RequestMapping("user/add") 2 public String add(@RequestParam("name") St ...

  2. IDEA与Tomcat的相关配置说明

    1.IDEA会为每个Tomcat部署的项目单独建立一份配置文件 查看控制台的log输出:Using CATAINA_BASE 2.工作空间项目和Tomcat部署的web项目 WEB-INF:内的资源不 ...

  3. GCRoots 对象

    GC Roots 虚拟机栈(栈帧中的本地变量表)中引用的对象 方法区中的类静态属性引用的对象 方法区中的常量引用的对象 原生方法栈(Native Method Stack)中 JNI 中引用的对象 可 ...

  4. 单独编译和使用webrtc音频增益模块(附完整源码+测试音频文件)

    webrtc的音频处理模块分为降噪ns和nsx,回音消除aec,回声控制acem,音频增益agc,静音检测部分.另外webrtc已经封装好了一套音频处理模块APM,如果不是有特殊必要,使用者如果要用到 ...

  5. lxhgww的奇思妙想 长链剖分板子

    https://vijos.org/d/Bashu_OIers/p/5a79a3e1d3d8a103be7e2b81 求k级祖先,预处理nlogn,查询o1 //#pragma GCC optimiz ...

  6. maven项目依赖其他jar包的时候,idea运行没问题,java -jar 报错:java.lang.SecurityException: Invalid signature file digest

    当项目依赖其他jar包的时候,打出的jar包执行出错,抛出这个异常. 原因:因为依赖jar包中的META-INF中有多余的.SF文件与当前jar包冲突, 解决方案 一 在打包前删除依赖jar包的.SF ...

  7. csdn的富文本编辑器(html)格式的文章,添加的代码格式粘贴到项目中总是不对,我这里是maven的pom文件。

    在用富文本编辑器(html)格式编辑的时候,总是出现将pom文件的配置从csdn粘贴到项目中发现很多红,是因为自己在设置的时候有问题. 因为我们的是pom.xml,这里原来设置的java呀或者js为了 ...

  8. Mybatis Resultmap 简化之超级父类

    我们在写 mybatis多表关联查询的时候 ,要配置  resultmap ,实在太麻烦.而这个超级父类 可以省去我们查询多表时的map public class SuperPojo extends ...

  9. CentOS7-Minimal安装MySQL服务

    CentOS7默认安装的是Mariadb而不是mysql,而Mariadb是mysql的一个分支, 安装mysql会覆盖Mariadb 一.下载MySQL官方的 Yum Repository [roo ...

  10. 解决Eclipse建立Maven Web项目后找不到src/main/java资源文件夹的办法

    问题如题,明细见下图: 解决方法: 在项目上右键选择properties,然后点击java build path,在Librarys下,编辑JRE System Library,选择workspace ...