未排序数组中累加和为指定值得最长子数组序列问题

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 }
View Code

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 }
View Code

 

3.题目:

给定一个无序数组,其中元素 为0,1,求数组中,0,1个数相等的最长子数组,

将0变为-1,同问题2

转载于:https://www.cnblogs.com/lp3318/p/5785542.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值