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

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

时间: 2024-10-06 17:06:28

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

数组中累加和为k的最大子数组的长度

package com.hzins.suanfa; import java.util.HashMap; public class demo { /** * 数组中累加和为k的最大子数组的长度 * @param arr * @param k * @return */ public static int maxLengh(int[] arr,int k){ if(arr == null || arr.length == 0){ return 0; } HashMap<Integer, Integer

数组的创建/查找数组里面的内容/添加数组中元素/使用指定的字符串把数组链接起来/判断数组内是否有指定的数组元素/四种遍历进行输出数组中的元素有哪些

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //创建数组 //1.快速创建数组@[] NSArray*[email protected][@"month",@"tue",@" wed",@"fir"]; //2,创建空的数组 NSArray*arr=[[NSArray a

一天一道算法题(1)---未排序数组中累加和为给定值的最长子数组

题目 给定一个无序数组arr,其中元素可正,可负,可0,给定一个整数k.求arr所有的子数组中累加和为k的最长子数组长度. 分析 为了解答题目,引入一个概念,s(i)代表子数组arr[0..i]所有元素的累加和.那么子数组arr[j-1, i](0<=j<=i<arr.length)的累加和为s(i)-s(j-1). 1. 设置变量sum=0,表示从0位置开始一直加到i位置所有元素的和.设置变量len=0,表示累加和为k的最长子数组长度.定义一个HashMap,其中key是sum值,va

算法总结之 未排序数组中累加和小于或等于给定值的最长子数组长度

给定一个无序数组arr,其中元素可正.可负.可0,给定一个整数k,求arr所有的子数组中累加和小于或等于k的最长子数组长度. 例如: arr=[3,-2,-4,0,6] , k=-2, 相加和小于或者等于-2的最长子数组为{3,-2,-4,0}, 所以结果返回4 解题思想: 预处理思想,把信息记录下来 累加和数组的改变 累加和数组中的最大值 用二分查找第一个大于等于某个值的位置 有序适合用二分查找 首先生成 sumArr  就是累加后的数组   这个数组大哦  因为 第一个为0 表示当没有任何一

未排序数组中累加和小于或等于给定值的最长子数组长度

题目描述 给定一个无序数组arr,其中元素可正.可负.可0.给定一个整数k,求arr所有的子数组中累加和小于或等于k的最长子数组长度 要求 时间复杂度为O(n),空间复杂度为O(n) 示例 输入描述 第一行两个整数N, k.N表示数组长度,k的定义已在题目描述中给出 第二行N个整数表示数组内的数 输出描述 输出一个整数表示答案 示例1 输入 5 -2 3 -2 -4 0 6 输出 4 备注 \(1 \leq N \leq 10^5\) $-10^9 \leq k \leq 10^9 $ $-10

算法总结之 未排序正数数组中累加和为给定值的最长子数组长度

例如  arr=[1,2,1,1,1]   k=3 累加和为 3的最长子数组为[1,1,1]   所以结果为3 思路方法: 两个指针 left  和right   初始值都是0  都在左边 sum 代表 子数组 left.....right的和 len 一直记录累加和为k的所有子数组中最大子数组的长度 根据 sum与k的比较结果决定  left 跟 right 哪一个移动!!!! package TT; public class Test70 { public static int getMax

《数据结构、算法与应用》8.(顺序查找数组中第一个出现指定元素的位置)

最近在读<数据结构.算法与应用>这本书,把书上的习题总结一下,用自己的方法来实现了这些题,可能在效率,编码等方面存在着很多的问题,也可能是错误的实现,如果大家在看这本书的时候有更优更好的方法来实现,还请大家多多留言交流多多指正,谢谢 8. 从左至右检查数组a[0:n-1]中的元素,以查找雨x相等的那些元素.如果找到一个元素与x相等,则函数返回x第一次出现所在的位置.如果在数组中没有找到这样的元素,函数则返回-1. // // main.cpp // Test_08 // // Created

把数组中的数据按照指定个格式拼接成一个字符串

/* * 需求:把数组中的数据按照指定个格式拼接成一个字符串 * 举例: *         int[] arr = {1,2,3};     * 输出结果: *        "[1, 2, 3]" * 分析: *         A:定义一个字符串对象,只不过内容为空 *         B:先把字符串拼接一个"[" *         C:遍历int数组,得到每一个元素 *         D:先判断该元素是否为最后一个 *             是:就直接

String-需求:把数组中的数据按照指定的格式拼接成一个字符串

package cn.lianxi; /* * 需求:把数组中的数据按照指定的格式拼接成一个字符串 * 举例: * int [] arr = {1,2,3}; * 输出结果 * “[1, 2, 3]” * 分析: * 1.定义一个字符串对象,只不过内容为空 * 2.把字符串拼接一个“[” * 3.遍历数组,得到每一个元素 * 4.先判断该元素是否为最后一个 * 是:就直接拼接元素和] * 不是:就拼接元素和逗号以及空格 * 5.输出拼接后的字符串 * */ public class zifu {