【题目】

给定一个数组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. MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合

    MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合 1.基本数据类型 我们常见有传递 int, string, bool, double, decimal 等类型. 需要注意的是前台传递的参 ...

  2. JS事件 加载事件(onload)注意:1. 加载页面时,触发onload事件,事件写在<body>标签内。 2. 此节的加载页面,可理解为打开一个新页面时。

    加载事件(onload) 事件会在页面加载完成后,立即发生,同时执行被调用的程序. 注意:1. 加载页面时,触发onload事件,事件写在<body>标签内. 2. 此节的加载页面,可理解 ...

  3. JS函数 返回值的函数 return sum;或者result = add2(3,4);

    返回值的函数 思考:上一节函数中,通过"document.write"把结果输出来,如果想对函数的结果进行处理怎么办呢? 我们只要把"document.write(sum ...

  4. 4、Docker网络访问

    现在我们已经可以熟练的使用docker命令操作镜像和容器,并学会了如何进入到容器中去,那么实际的工作中,我们通常是在Docker中部署服务,我们需要在外部通过IP和端口进行访问的,那么如何访问到Doc ...

  5. PokerNet-poker recognition: 基于人工神经网络的扑克识别 (5)

    结果解读 结果1 结果2 结果1 void computeBCValue(cv::Mat mat_img, std::vector<bbox_t> result_vec, std::vec ...

  6. win10安装mysql__艰难的心路历程

    俺是新系统,嘿嘿嘿 首先,把下载好的压缩包解压到安装目录中,哪个盘可以. 第二,先创建my.ini文件,不然待会忘了.在文件中添加以下内容: [mysqld] port = basedir=C:\Wi ...

  7. scala中类的简单使用记录

    import scala.collection.mutable.ArrayBuffer /** * scala 中内部类的使用 */ class Classes { class Stu(name:St ...

  8. ZJOI 2006 物流运输 bzoj1003

    题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪. ...

  9. text-html 转译

    var HtmlUtil = { 2 /*1.用浏览器内部转换器实现html编码(转义)*/ 3 htmlEncode:function (html){ 4 //1.首先动态创建一个容器标签元素,如D ...

  10. 20175323《Java程序设计》第五周学习总结

    教材学习内容总结 第五章的知识框架总结 代码托管:https://gitee.com/ruirui_yummy/java-besti-20175323 代码提交过程截图 代码量截图 学习进度条 代码行 ...