博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
左神算法进阶班8_1数组中累加和小于等于aim的最长子数组
阅读量:4541 次
发布时间:2019-06-08

本文共 2360 字,大约阅读时间需要 7 分钟。

【题目】

给定一个数组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,则可以知道最长数组是多少了

【代码】

1 #pragma once 2 #include 
3 #include
4 5 using namespace std; 6 7 int theLongestArray(vector
v, int aim) 8 { 9 //使用两个指针,作为窗口的左右端10 int l = -1;11 int r = 0;12 int sum = 0;13 int res = 0;14 for (; r < v.size(); ++r)15 {16 sum += v[r];17 while (sum > aim && l < r)//向右移动窗口18 {19 ++l;20 sum -= v[l];21 }22 res = res > (r - l) ? res : (r - l);23 }24 return res;25 }26 27 28 int theLongestArray_2(vector
v, int aim)29 {30 int* min_sum = new int[v.size()];//以i开头的数组的最小和31 int* min_sum_index = new int[v.size()];//以i开头的数组的最小和数组右端32 for (int i = v.size()-1; i >= 0; --i)33 {34 if (i + 1 < v.size() && min_sum[i + 1] < 0)//右端最小和为负数,则可加上自己比自己更小35 {36 min_sum[i] = min_sum[i + 1] + v[i];37 min_sum_index[i] = min_sum_index[i + 1];38 }39 else//右端为整数,加上自己比自己大,那么就以自己为最小的数组和40 {41 min_sum[i] = v[i];42 min_sum_index[i] = i;43 }44 }45 //定义窗口的左右边界46 int l = -1;47 int r = 0;48 int res = 0;49 int sum = 0;50 for (int i=0;i
aim)55 {56 ++l;57 sum -= v[l];58 }59 res = res > (r - l) ? res : (r - l);60 }61 delete[]min_sum;62 delete[]min_sum_index;63 return res;64 65 }66 void Test()67 {68 vector
v;69 v = { 1,2,3,4,5,1,1,1,1,1,1,1,7,8,9};70 cout << theLongestArray(v, 7) << endl;71 v = { 1,2,3,4,5,1,1,-99,1,1,1,1,1,7,8,9,10,11,-99};72 cout << theLongestArray_2(v, 7) << endl;73 }

 

转载于:https://www.cnblogs.com/zzw1024/p/11097757.html

你可能感兴趣的文章
Flask Web开发从入门到放弃(一)
查看>>
数组的完全随机排列
查看>>
cuda和显卡驱动版本
查看>>
LeetCode OJ
查看>>
你的焦虑迷茫真的不是因为太懒太闲?
查看>>
Autolayout + VFL(Visual Format Language)
查看>>
通过虚拟驱动vivi分析摄像头驱动
查看>>
【JZOJ100208】【20190705】传说之下
查看>>
面试小记
查看>>
线性代数
查看>>
网页设计
查看>>
批量删除空行
查看>>
Java输入
查看>>
Python-ORM之sqlalchemy的简单使用
查看>>
Preserving Remote IP/Host while proxying
查看>>
跟潭州学院的强子老师学习网络爬虫---爬取全书网
查看>>
bzoj千题计划178:bzoj2425: [HAOI2010]计数
查看>>
[国家集训队2012]middle
查看>>
使用Holer远程桌面登录家里电脑和公司内网电脑
查看>>
Java数组5作业(2015-8-27)
查看>>