给定一个数组,值可以为正、负和0,请返回累加和为给定值k的最长子数组长度。
思路
1.逐个元素求取累加和 ,当保存最累加和最先出现的情况。
2.设K 为定值,当当前的累加和 减去K 时, 有存在对应的累加和,则中间的距离就为长度,进行保存,直到所有序列遍历完毕。
代码如下,
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<map>
using namespace std;
int N;
int arr[1000];
int randarr(int N){
srand((int)time(0));
for(int i=0;i<N;i++){
arr[i] = rand()%11-5;// [-5,5]
}
return 0;
}
void printarr(int N){
for(int i=0;i<N;i++){
printf("%d ",arr[i]);
}
printf("\n");
}
void initarr(int N){
randarr(N);
printarr(N);
}
int main() {
//初始化 数量
N=10;
initarr(N);
//定义 map 保存 sum, index 键值对
map<int,int> map_ ;
//先预定 sum=0 的情况,设定 index 为-1
map_[0] = -1;
int K = 5;//设定求和为 5
int sum = 0;
int len = 0;
for(int i=0;i<N;i++){
sum += arr[i];
if(map_.find(sum-K)!=map_.end()){
len = max(len,i- map_[sum-K]);
}
if(map_.find(sum)==map_.end()){
map_[sum] = i;
}
}
printf("%d\n",len);
return 0;
}