1.题目:
给定一个无序数组,其中元素 可正可负可0,给定一个k,求arr中所有的子数组累加和为k的最长子数组长度。
1 // maxLength.cpp : 定义控制台应用程序的入口点。 2 //未排序数组中累加和为指定值的最长子数组长度 3 //数组元素可正、可负、可0 4 5 #include "stdafx.h" 6 #include<iostream> 7 #include <map> 8 #include <iterator> 9 10 /* 11 声明一个map<key,value>, 12 key为0到每个位置的累加和, 13 value为某个累加和最早出现的位置 14 */ 15 using namespace std; 16 17 18 void findMaxLength(int arr[],int len, int k) 19 { 20 if(len <= 0) 21 return; 22 23 map<int,int> myMap; 24 //map 能保证相等的累加和是出现位置最靠前的那个,之后的插不进去 25 myMap[0] = -1;//当累加和正好为k时,就找到-1位置 26 27 /*pair<int,int> value(0,-1); 28 myMap.insert(value);*/ //map的第二种插入方式 29 30 int CurSum = 0; 31 int result = 0; 32 33 for(int i = 0;i < len; i++) 34 { 35 CurSum += arr[i]; 36 37 map<int,int>::iterator ite; 38 if((ite = myMap.find(CurSum - k))!= myMap.end()) 39 {//在map中存在cursum-i,进行一次结算 40 result = max(result,i - myMap[CurSum - k]); 41 } 42 else 43 myMap[CurSum] = i; 44 //插入map中的一定是最早的sum值,重复了插入不了 45 } 46 if(result == 0) 47 cout<<"不存在这样的数组"<<endl; 48 else 49 cout<<result<<endl; 50 } 51 int _tmain(int argc, _TCHAR* argv[]) 52 { 53 int arr[] = {1,2,3,4,5,6,7,8,9,10}; 54 int givenValue = 29; 55 //int givenValue = 29; 56 int len = 10; 57 findMaxLength(arr,len,givenValue); 58 system("pause"); 59 return 0; 60 }
map作为哈希表来使用,O(logn)时间内插入,查找到元素。
2.题目:
给定一个无序数组,其中元素 可正可负可0,求数组中正负数个数相等的最长子数组
1 // maxLength2.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #include <map> 7 #include <iterator> 8 9 using namespace std; 10 11 void maxLength2(int arr[],int len) 12 { 13 if(len <= 0) 14 return; 15 16 /*将整数变为1,负数变为-1,求给定值为0的最长子数组 17 */ 18 for(int i = 0;i < len ;i++) 19 { 20 if(arr[i] < 0) 21 arr[i] = -1; 22 else if(arr[i] > 0) 23 arr[i] = 1; 24 } 25 26 27 int curSum = 0; 28 int result = 0; 29 30 map<int,int> myMap; 31 myMap[0] = -1; 32 33 map<int,int>::iterator ite; 34 35 for(int j = 0; j < len; j++) 36 { 37 curSum += arr[j]; 38 if((ite = myMap.find(curSum))!=myMap.end()) 39 result = max(result,j - myMap[curSum]); 40 else 41 myMap[curSum] = j; 42 } 43 44 if(result != 0) 45 cout<<result<<endl; 46 else 47 cout<<"不存在"<<endl; 48 49 } 50 51 int _tmain(int argc, _TCHAR* argv[]) 52 { 53 int arr[] = {1,2,3,4,5,7,-1,-2,-3,-4,-5,0}; 54 int len = 12; 55 maxLength2(arr,len); 56 system("pause"); 57 return 0; 58 }
3.题目:
给定一个无序数组,其中元素 为0,1,求数组中,0,1个数相等的最长子数组,
将0变为-1,同问题2