求定值k的最長子數組長度

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章