题目描述
给定一个数组arr,该数组无序,但每个值均为正数,再给定一个正数k。求arr的所有子数组中所有元素相加和为k的最长子数组的长度 例如,arr = [1, 2, 1, 1, 1], k = 3 累加和为3的最长子数组为[1, 1, 1],所以结果返回3 [要求] 时间复杂度为O(n),空间复杂度为O(1)
输入描述
第一行两个整数N
, k。N表示数组长度,k的定义已在题目描述中给出
第二行N个整数表示数组内的数
输出描述
输出一个整数表示答案
示例
输入:
5 3
1 2 1 1 1
输出:
3
备注
1⩽N⩽
10^5
1⩽k⩽
10^9
1⩽arri⩽
100
解题思路
使用滑动窗口来实现。具体使用双指针来实现。
1、当滑动窗口的值等于k:滑动窗口左边界向右移动 2、当滑动窗口的值小于k:滑动窗口右边界向右移动 3、当滑动窗口的值大于k:滑动窗口左边界向右移动
代码实现
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std
;
int main(){
int N
, k
;
cin
>> N
>> k
;
vector
<int> arr(N
);
for(int i
= 0;i
< N
;i
++){
cin
>> arr
[i
];
}
int max_len
= 0;
int left
= 0;
int right
= 0;
int sum
= arr
[0];
while(right
< N
){
if(sum
== k
){
max_len
= max(max_len
, right
- left
+ 1);
sum
-= arr
[left
];
left
++;
}else if(sum
< k
){
right
++;
if(right
== N
){
break;
}
sum
+=arr
[right
];
}else{
sum
-= arr
[left
];
left
++;
}
}
cout
<< max_len
<< endl
;
return 0;
}