数组是首尾相连的,即相当于数组是一个环的结构,要求从这个环的结构中求出最大的和
2014-08-24 20:37
801 查看
转自: http://blog.csdn.net/acaiwlj/article/details/9404151
解法:当数组是首尾相连时,求连续子数组最大和的方法可以归纳如下:
1.将原数组进行扩充,即假设原数组为{1,2,-3,4,5},则扩充相当于{1,2,-3,4,5,1,2,-3,4,5}
2.利用上述的解法在扩充后的数组进行遍历求其连续子数组的最大和,不过要做一些小改动,即保证子数组的长度在原数组的长度范围之内。这样求出来的结果即是原数组首尾相连后,连续子数组的最大和。
注:当然,此处我们并不需要重新申请一个2倍原数组大小的额外空间,只需要在遍历的时候,下一个索引值采用mod n的方法。具体可以参见源代码。
解法:当数组是首尾相连时,求连续子数组最大和的方法可以归纳如下:
1.将原数组进行扩充,即假设原数组为{1,2,-3,4,5},则扩充相当于{1,2,-3,4,5,1,2,-3,4,5}
2.利用上述的解法在扩充后的数组进行遍历求其连续子数组的最大和,不过要做一些小改动,即保证子数组的长度在原数组的长度范围之内。这样求出来的结果即是原数组首尾相连后,连续子数组的最大和。
注:当然,此处我们并不需要重新申请一个2倍原数组大小的额外空间,只需要在遍历的时候,下一个索引值采用mod n的方法。具体可以参见源代码。
/** *首尾相连连续子数组的最大和 *@param max_l:最终子数组的起始索引 *@param max_h:最终子数组的终止索引 *@return :返回最大的子数组的和 */ long getMaxSum(int *arr, int n, int &max_l, int &max_h) { if(arr == NULL || n == 0) return LONG_MIN; if(arr == NULL || n == 0) return LONG_MIN; long max_sum = LONG_MIN; long sum = 0; int tmp_l = 0; int tmp_h = 0; for(int k = 0; k < 2*n; k++) { int i = k % n; sum += arr[i]; tmp_h = k; if(tmp_h - tmp_l + 1 > n) { //确保子数组的长度不超过n sum -= arr[tmp_l%n]; tmp_l++; } if(sum > max_sum) { max_sum = sum; max_l = tmp_l; max_h = tmp_h; } if(sum <= 0) { sum = 0; tmp_l = k+1; tmp_h = k+1; } } return max_sum; }
相关文章推荐
- 堆的数据结构能够使得堆顶总是维持最大(对于大根堆)或最小(对于小根堆),给定一个数组,对这个数组进行建堆,则平均复杂度是多少?如果只是用堆的 push 操作,则一个大根堆依次输入 3,7,2,4,1,5,8 后,得到的堆的结构示意图是下述图表中的哪个?
- 给一个数组,求a[i]<a[j]的情况下,j-i的最大值是多少,要求用O(n)时间复杂度
- 建立一个学生结构数组来记录学生信息(学号ID,姓名和C语言成绩),要求动态建立一个结构数组,数组长度从键盘输入,自行给数组元素赋值并打印学生信息,最后不要忘记释放内存。 结构st
- .已知地址块中的一个地址是140.120.84.24/20。试求这个地址块中的最小地址和最大地址。地址掩码是什么?地址块中共有多少个地址?相当于多少个C类地址?
- 返回一个首尾相连的二维数组的最大子数组的和
- 题目:返回一个整数数组中最大子数组的和。(要求程序必须能处理1000 个元素)
- 返回一个首尾相连的整数数组中最大子数组的和
- 定义一个二维数组,写函数来实现对该二维数组求最大值。(要求,用行指针为函数形参)
- 设一个长度为10的整型数组, 0)要求每个元素的值通过scanf输入,输入完成后, 1)请顺序输出这些整数, 2)请倒序输出这些整数, 3)输出这些数中的最大值, 4)输出这些数中的最小值
- 题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个 子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为 O(n)。
- 一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组的和的最大值,要求时间复杂度为O(n)。
- 如果给定一个数组arr[0,...N-1],要求找出相邻两个数的最大差值
- 现在有一个有序的数组,要求用户输入一个整数放到数组中还保证这个数组是有序的。
- 阿里巴巴面试算法题:有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机取出一个数,而这个数必须是符合1/N
- 一个整数数组(正负,0),找出这个数组的最大子序列
- 给出一个数组,要求查找出这个数组中按顺序排第K大的数字
- 给一个数组[a1,a2,a3....an],要求出令ai-aj有最大值,其中i<=j,时间和空间复杂度尽可能小
- 返回一个首尾相连的整数数组中最大子数组的和
- 一个有n个整数的递增有序数组。对它进行向左或向右循环移动若干次后,要求给出一个代码实现,尽可能快地从这个数组中寻找指定值所在的位置
- 有一个int型数组,每两个相邻的数之间的差值不是1就是-1.现在给定一个数,要求查找这个数在数组中的位置