【题目】

给定一个数组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. 什么是哈希Hash(散列函数)

    Hash(散列函数) Hash,一般翻译做散列.杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就 ...

  2. Linux 实用指令(9)--进程管理

    目录 进程管理 1 进程的基本介绍 2 显示系统执行的进程 2.1 说明: 2.2 ps指令详解 2.3 应用实例 3 终止进程kill和killall 3.1 介绍 3.2 基本语法 3.3 常用选 ...

  3. C 二维数组与指针

    http://c.biancheng.net/view/2022.html 1. 区分指针数组和数组指针 指针数组:存放指针的数组,如 int *pstr[5] = NULL; 数组中每个元素存放的是 ...

  4. STL之__ type_traits

    __type_traits:双底线是说明这是SGI STL内部使用的东西,不在STL标准范围之内.iterator_traits负责萃取迭代器(iterator)的特性.而__type_traits则 ...

  5. ubuntu卸载node和npm

    sudo apt-get remove --purge npm sudo apt-get remove --purge nodejs sudo apt-get remove --purge nodej ...

  6. 数据库MySQL--修改数据表

    创建数据库::create database 数据库名: 如果数据不存在则创建,存在不创建:Create database if not exists 数据库名 ; 删除数据库::drop datab ...

  7. CSIC_716_20191106【列表、元组、字典、集合】

    python的数据类型及其内置方法 一.列表(续) list.count( ).list.index( ) list = ['1', '2', '3', '2', 'a', 'b', 'c', 'a' ...

  8. springboot mail 发送邮件

    新开发了一个新的功能,要求使用java发送邮件,在此记录下代码,以方便后来者: 1.首先需要开通邮箱,开通smtp功能,我这边使用的是新浪邮箱,试过163.qq,比较麻烦,后来看到别人使用新浪,直接使 ...

  9. Java int和Integer包装类的区别和比较

    区别:                                                                                                  ...

  10. leetcood学习笔记-2-两数相加

    题目描述: 方法一: # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.va ...