数组连续最大子和及环形数组最大子和

问题1:

/*求连续子数组的最大和:
* 设curSum为当前子数组(ai, ai+1, ......, aj)的和
* sum存放到目前为止子数组和的最大值
* 1. cursum+ai>0; cursum=cursum+ai
* 2. cursum+ai<=0; cursum=ai; */

 1 int maxsubarr(vector<int> &a)
 2 {
 3 if(a.size()==0)
 4     return 0;
 5     int sum=0x80000000; //sum设为最小32位数
 6     int cursum=0;
 7     for(int i=0;i<a.size();i++)
 8     {
 9         if(cursum<=0)
10             cursum=a[i];
11             else
12                 cursum+=a[i];
13         if(cursum>sum)
14             sum=cursum;
15     }
16     return sum;
17 }

由于cursum<0时,cursum取下个数组的值,当测试数据全为负数时,无法得到正确结果,比如:{-1,-5,-7,-3};cursum会为-3,无法得到正确结果,有待解决。

问题2:

/*
求一维环形数组的连续子数组最大和--数组为a[n],a[n]环连接a[0]
问题分解为两种情况:
1. 最大和出现在 a[n-1]之前,即简化为非环形的连续子数组最大和,结果为max1
2. 最大和越过了a[n-1],a[0], 即成为环问题,由于一组数的和为定值,找出连续的最小和
* 用定值和减去连续的最小和,剩下的连续片段即为连续的最大和,结果为max2
* 求解连续的最小和时,可以利用问题1的函数求解最小和,(最小和肯定是负数导致)将数组所有元素取负,
* 那么求出的最大和即为最小和的负数形式。
* 最后比较max1和max2,取其中较大值。
*/

 1 int maxcirclesub(vector<int> &a)
 2  {
 3      int max1,max2;
 4      max1=maxsubarr(a);
 5      int suma=0;
 6      int len=a.size();
 7      vector<int> na(len);
 8      for(int i=0;i<len;i++)
 9      {
10          suma+=a[i];
11          na[i]=-a[i];
12      }
13      max2=maxsubarr(na);
14      max2=max2+suma;
15      return (max1>max2)?max1:max2;
16 }

其中maxsubarr为问题1中的函数。

时间: 2024-08-08 16:20:16

数组连续最大子和及环形数组最大子和的相关文章

环形数组求子数组和最大

题目:返回一个整数数组中最大子数组的和.要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值. 分析: 运用了第一次的实验返回数组的最大子数组和,就只是把环形数组变成了n次的数组. 但是我们没有保存每一次的最大值,只是比较了最大值,所以没有返回子数组的位置. #inc

[CareerCup] 14.6 CircularArray 环形数组

14.6 Implement a CircularArray class that supports an array-like data structure which can be efficiently rotated.The class should use a generic type, and should support iteration via the standard for (Obj o : CircularArray) notation. 这道题让我们实现一个环形数组类C

查找环形数组的和最大的连续子数组

设计思想: 把一个数组连成环,查找这个环的和最大的连续子数组时走到原来的数组尾部可以再继续加第一个元素,所以等价于构建一个原来数组2倍的数组 查找和最大的连续子数组方法: 设原先数组两倍的数组名为a,长度为2n - 1,原数组长度为n 定义一个当前的总和currectSum,初始值为a[0];定义一个当前总和的开始加和的位置下标currectStartIndex,初始值为0:定义一个记录连续加了多少个数的变量count,初始值为1.定义一个长度为3的结果数组result,用来存放最终找到的和最大

结对开发之环形数组

一.题目与要求 题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n) 二.设计思路 1.在上一次求一维数组最大子数组的问题上,进行拓展,继续使用类似的求和方法 2.应题目要求,这次的一位数组要首尾

环形数组最大子数组之和

题目:返回一个整数数组中最大子数组的和.要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值. 合作伙伴:孟西鑫 博客地址:http://home.cnblogs.com/u/wanzitou/feed/blog/ 结对编程要求: 两人结对完成编程任务. 一人主要负责

软件工程——结对开发环形数组

一.题目: 返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如 果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思路 开始想的是用链表实现数组首尾相连,可是由于链表用着不太熟悉,便想了另一种算法: 当最大值未出现跨域是就按常规方法计算找

结对开发~环形数组篇

实验题目 题目:返回一个整数数组中最大子数组的和. 要求:      输入一个整形数组,数组里有整数也有负数.      数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.      如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],……A[n-1],A[0]……A[j-1]之和最大.      同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 实验思路 由于这次所要求的子数组相当于一个环形的数组,所以就想到了类似数字右循环的形式来解决这个

《团队项目开发之三对一维环形数组的求解》

设计思想:通过把数组的长度扩大为原来的一倍,相当于新数组是由对原来的数组重复了一遍后而组成的,这样保证了数组以环状的形式,按照数组中每个数字的位序依次对它们可能形成的最大子数组依次进行比较,这样保证了能够始终记录每次最大子数组的位置,以便随着程序的进行不断更新直至得到最终的最大子数组之和以及最大子数组的下标. 源代码: //求一个一维环形数组的最大子数组之和,并要求返回组成最大子数组的下标 //李敏,Apr 12th #include<iostream> #include <time.h

结对开发——求二维环形数组所有子矩阵最大和的问题

一.题目要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和. 二.解决思路: 由于上次我们做过求二维数组最大子矩阵和的问题,又做了求一维环状数组的子数组最大值问题,这次就在以前的基础上进行修改,先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果.