求数组中和为0的最大子数组

#include<map>
#include<iostream>
#include<vector>
#include<set>
using namespace std;
void get(vector<int> a)
{
	vector<int> num;
	int i = 0;
	map<int, int> ma;
	num.push_back(0);
	num.push_back(a[0]);
	for (i = 1; i < a.size(); i++)
	{
		num.push_back(num[i] + a[i]);
	}
	for (i = 0; i < num.size(); i++)
	{
		ma[num[i]]++;
	}
	set<int> fi;
	map<int, int>::iterator it;
	for (it = ma.begin(); it != ma.end();it++)
	{
		if (it->second>1)
		{
			fi.insert(it->first);
		}
	}
	int j = 0, n = 0, first = 0, last = 0;
	for (i = 0; i < num.size(); i++)
	{
		if (fi.find(num[i]) != fi.end())
		{
			for (j = i; j < num.size(); j++)
			{
				if (num[i] == num[j])
					if (j - i>n)
					{
						n = j - i;
						first = i;
						last = j;
						//cout << i<<" "<<j<<num[i] << " " << num[j]<<endl;
					}
			}
		}
	}

	/*
	for (j = 0; j < num.size(); j++)
	{
		for (i = 0; i <= j; i++)
		{
			if (num[i] == num[j])
				if (j - i>n)
				{
					n = j - i;
					first = i;
					last = j;
					//cout << i<<" "<<j<<num[i] << " " << num[j]<<endl;
				}
		}
	}
	*/
	for (i = first; i < last; i++)
		cout << a[i] << " ";
}

int main()
{
	int x;
	vector<int> a={1,2,3,4,-4,-3,-1,-2,5,6} ;
	get(a);
}

思想:i < j;
sum[i] = a[0] + ...+ a[i];
sum[j] = a[0] + ...+ a[j];
如果sum[i]和sum[j]相等,则a[i + 1] + ... + a[j] = 0;

时间: 2024-10-27 10:00:20

求数组中和为0的最大子数组的相关文章

数组1--求一个数的最大子数组

结对开发 我的队友是王春帆20132902博客园地址http://www.cnblogs.com/-beauTiFul/ /* 设计思路: 输入数组 -3 4 2 -7 6 1 a[0]=sz[0];-3 a[1]=max(a[0]+sz[1],sz[1]);4 a[2]=max(a[1]+sz[2],sz[2]);6 a[3]=max(a[2]+sz[3],sz[3]);-1 a[4]=max(a[3]+sz[4],sz[4]);6 a[5]=max(a[4]+sz[5],sz[5]);7 m

二维数组求最大子数组

设计思路: 首先定义产生二维数组,定义可输入二维数组行和列,各位数随机产生: 然后进行最大子数组的求和比较,从每行的第一个数为子数组的起点开始进行不同的子数组遍历比较,只存放最大的子数组,以及记录最大子数组的位置,从第一个数开始每行每列进行求和比较,以求得最大子数组的值,以及最大子数组所包含的数: 最后进行结果的输出与验证. 代码: 法一: package zishuzu; import java.util.*; public class zuixiaozishuzu { public stat

求数组中和为给定值的所有子序列

2017年网易游戏的一道编程题,大致意思是满足组合攻击技能,必须是所选择时技能的和为m(m>0),且所选的这些技能的乘积最大: 分解后主解决两个问题: 其一:求数组中和为m的所有子数组: 其二:在满足一的条件下,求所有子数组的最大值: 主要考察的还是如何求数组中和为m的所有子数组: 如:数组[1,2,3,4,5,6],m=7时,满足条件的子数组有[1,2,4],[3,4],[2,5],[1,6]; 主要使用回溯法解决该问题,思路以后补上: import java.util.ArrayList;

求整数组环中最大子数组的和(升级版)

题目:返回一个整数数组中最大子数组的和 额外要求:让数组手尾相连,构成一个环,允许a[n],a[0]...这种形式.同时返回最大子数组的位置 设计思想:将环断开,成为一条线,分析这条线上的最大子数组,找到最大子数组,便可以找到最大子数组的起点和终点,然后将终点看作起点,将起点看作终点,将线连成环,在进行寻找最大子数组(寻找时不算上起点和终点),最后将先后找到的两个最大子数组连在一起就形成了这个整数组环的最大子数组,然后将记录的起点和终点输出出来,返回最大子数组的位置. 出现的问题:无法输入更多的

一维循环的数组求出最大子数组的和

题目是:一维循环的数组求出最大子数组的和 老师刚给出这个题目时 ,求出一维子数组的最大子数组的和,当时我就想原来已经做过一个求出一维数组的最大子数组的和,能不能在此基础上延伸一下,于是我就想怎样利用原来的算法,后来我就想既然是还是求出最大子数组的和肯定原来的东西可以利用. 我想既然是循环,无外乎就是这个数组进行两遍,所以我感觉这样就可以再在这个数组后面申请一个和它长度相同,数的大小和顺序和它一样的数组,这样就起到了循环的目的,于是我就这样进行了,然后再调用原来的方法,这样就可以求出最大子数组的值

Maximum Product Subarray 求最大子数组乘积

这个求最大子数组乘积问题是由最大子数组之和问题演变而来,但是却比求最大子数组之和要复杂,因为在求和的时候,遇到0,不会改变最大值,遇到负数,也只是会减小最大值而已.而在求最大子数组乘积的问题中,遇到0会使整个乘积为0,而遇到负数,则会使最大乘积变成最小乘积,正因为有负数和0的存在,使问题变得复杂了不少.. 比如,我们现在有一个数组[2, 3, -2, 4],我们可以很容易的找出所有的连续子数组,[2], [3], [-2], [4], [2, 3], [3, -2], [-2, 4], [2,

求二维数组最大子数组

结对队友:胡康臻.杨寒寒 1.设计思想: 首先定义产生二维数组,定义可输入二维数组行和列,各位数随机产生: 然后进行最大子数组的求和比较,从每行的第一个数为子数组的起点开始进行不同的子数组遍历比较,只存放最大的子数组,以及记录最大子数组的位置,从第一个数开始每行每列进行求和比较,以求得最大子数组的值,以及最大子数组所包含的数: 最后进行结果的输出与验证. 2.代码 import java.util.*; public class zuixiaozishuzu { public static vo

【算法导论】最大子数组问题

寻找数组A的和最大的非空连续子数组.例如:int A[] = {1, -2, 3, 10, -4, 7, 2, -5}的最大子数组为3, 10, -4, 7, 2,其最大和为18. 方法1:枚举所有子数组并求出他们的和. 长度为n的数组有O(n2)个子数组(即:n + n-1 + ... + 1=n(n+1)/2):而且求一个长度为n的数组的和的时间复杂度为O(n).因此这种思路的时间复杂度是O(n3). 1 #include <iostream> 2 #include <vector&

分治策略 &nbsp; 最大子数组问题

递归式 递归式与分治方法是紧密相关的,因为使用递归式可以很自然地刻画分治算法的运行时间.一个递归式就是一个等式或不等式,它通过更小的输入上的函数值来描述一个函数.例如,在2.3.2节,我们用递归式描述了MERGE-SORT过程的最坏情况运行时间T(n): Θ(1)        若n=1 T(n) =                         (4.1) 2T(n/2)+Θ(n)    若n>1 求解可得T(n)=Θ(nlgn) 递归式可以有很多形式.例如,一个递归算法可能将问题划分为规模