输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和
来源:互联网 发布:怎么在淘宝外卖上开店 编辑:程序博客网 时间:2024/04/30 09:27
输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
题目来源于:http://blog.csdn.net/v_JULY_v/archive/2010/11/12/6004660.aspx
思路一:
老实说我一开始看到该题目的时候到想到解法还是花了点时间,具体思路是这样,因为时间复杂度是0(n),所以我们只能用一次遍历就要求出最大的子数组和,所以我的想法是这样:以空间换取时间,用一个和原来数组一样大的临时数组记录遍历过程中的和,遍历过程中依次对每个Item都同样进行以下的动作:当遇到负数的时候,就把当前的Sum值记录到临时数组中,然后判断当前的Item的绝对值是否大于Sum,如果大于,将Sum恢复为原来的初始值,也就是Sum = 0,如果Item的绝对值小于Sum的话就把Sum += Item值。当然如果遍历过程中遇到的Item > 0的情况,直接Sum += Item.等到遍历结束后,从临时数组中捉取最大值就是最大的子数组和的值。
代码如下:
- assert(NULL != pnArray);
- if (1 == nSize) return *pnArray;
- int *pnSum = new int[nSize + 1];
- assert(NULL != pnSum);
- int i32Sum = 0, i32CurValue = 0, i32Index = 0;
- for (int i32I = 0; i32I < nSize; i32I++)
- {
- i32CurValue = *(pnArray + i32I);
- if (i32CurValue >= 0)
- {
- i32Sum += i32CurValue;
- }
- else if ((i32CurValue < 0))
- {
- *(pnSum + i32Index++) = i32Sum;
- i32Sum = (abs(i32CurValue) > i32Sum) ? 0 : (i32Sum + i32CurValue);
- }
- }
- pnSum[i32Index] = i32Sum;
- if (0 != i32Index)
- {
- i32Sum = *pnSum;
- for (int i32J = 1; i32J <= i32Index; i32J++)
- {
- if (*(pnSum + i32J) > i32Sum)
- {
- i32Sum = *(pnSum + i32J);
- }
- }
- }
- delete [] pnSum;
- return i32Sum;
思路二:
其实这道题只要一次遍历就可以求出最大的子数组和,而且是很简单的就解决了,具体想法是这样,不断的累加每个数组元素,并用一个变量保存当前的最大值,累加的过程一直和该变量进行比对,如果大于最大值,就把当前的最大值保存下来,反复如此就可以求出最大值.
上面给出的算法太复杂,以下的算法是在上面的基础上进行改进,而且是很容易理解。代码如下:
- int MaxSum(int* a, int n)
- {
- int nSum = 0;
- int nValue=0;
- for(int i = 0; i < n; i++)
- {
- if (nValue <= 0)
- nValue = a[i];
- else
- nValue += a[i];
- if(nSum < nValue)
- nSum = nValue;
- }
- return nSum;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- int anAry[] = {-2, 10,12, -20, 33};
- //int nMaxValue = MaxSubArraySum(anAry, sizeof(anAry)/sizeof(int));
- int nMaxValue = MaxSum(anAry, sizeof(anAry)/sizeof(int));
- cout << "最大的子数组和为:" << nMaxValue << endl;
- return 0;
- }
- 每天学习一算法系列(4) (输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和)
- 输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和
- 【C语言】输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
- 每天学习一算法系列(4) (输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和)
- 题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个 子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为 O(n)。
- 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个 子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
- 一个整形数组中有正数也有负数,数组中连续一个或多个组成子数组,每个子数组都有一个和,求所有子数组中和的最大值
- 一个整形数组中有正数也有负数,数组中连续一个或多个组成子数组,每个子数组都有一个和,求所有子数组中和的最大值
- 一个整形数组中有正数也有负数, 数组中连续一个或多个组成子数组,每个子数组都有一个和, 求所有子数组中和的最大值
- 输入整形数组,数组里有正数也有负数,数组中一个或连续的多个整数组成数组的子数组,求所有子数组中和的最大值 ,例如输入的数组为{1,-2,3,10,-4,7,2,-5}和最大的子数组为{3,10,
- 输入一个整形数组,数组中有正数也有负数,求该数组中所以子数组和的最大值
- 输入一个整形数组,数组里有正数也有负数。。。。。。。。。。。。
- 有一个数组,由正整数、负整数、零组成,求和最大的连续子数组
- 编程随记:有整型数组a[],中间有连续递增的子数组,现在要求把原来数组中每个递增部分组成一个新的数组
- hunter学算法-从一个数组中找到和最大的子数组,数组中可能有负数。
- 输入一个有正负整数的数组,寻找最大子数组
- 有一个整数数组(包括正数 负数 和0),给定一个M值,要求数组中的一个或多个值相加的和等于M,有多少种组合?
- 一个数组由2n个整数组成,把这个数组分成两半,各有n个整数,求一个分法,使这两个子数组和的差最小
- LeetCode Pascal's Triangle II
- cmd 显示前一页
- java经典算法_009"完数"等于他的所有因子之和,例如:6=1+2+3,求1000以内的所有完数
- Java 常见内存泄漏及其解决方案
- mudos 64相关整理
- 输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和
- Android View.scrollTo, View.scrollBy控制视图滚动原理
- RationalRose安装步骤
- PCB 布线注意事项
- 关于Java对象和XML之间的相互转换
- Java加密和数字签名消息摘要一
- Java加密和数字签名私钥加密二
- JAVA反射机制学习
- hdu 2254 不错的矩阵 从a到b 在规定时间内有多少条路到达