給定一個數組,值可以爲正、負和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;
}