面试题31:连续子数组的最大和

原创 2016年08月29日 13:46:36
1.题目:输入一个整形数组,数组里面有正数也有负数,数组中一个或者连续的多个整数组成一个子数组。求所有子数组的和的最大值,时间复杂度为O(n).
例如:输入的数组为{1,-2,3,10-4,7,2,-5},则和的最大子数组为{3,10,-4,7,2},因此输出为该子数组的和为18.
思路:
可以设置两个变量,逐向相加数组中的每一项,更新这两个变量的值,当累加的子数组的和不为负值时,继续累加,后面累加的值可能是最大值,当为负值的时候就更新子数组和的值,从当前的数据项开始,每一次都和最大的子数组的和进行比较,为了防止数组中的值都是负数,所以刚开始设置最大的子数组的值是最小的负数值,便于比较更新。


源码:
/**
		* 功能说明:找最大子数组的和
		* 作者:K0713
		* 日期:2016-8-29
**/
#include<iostream>
using namespace std;
bool g_InvalidInput = false;
//找最大子数组的和
int FindGreatestSumOfSubArray(int *pData, int nLength)
{
	if ((pData == NULL) || (nLength <= 0))
	{
		g_InvalidInput = true;
		return 0;
	}

	g_InvalidInput = false;

	int nCurSum = 0;
	int nGreatestSum = 0x80000000;//0x80000000是最小的int型(负)数,将nGreatestSum初始化为最小的int值,是为了应对输入全负的情况
	for (int i = 0; i < nLength; ++i)
	{
		if (nCurSum <= 0)
			nCurSum = pData[i];
		else
			nCurSum += pData[i];

		if (nCurSum > nGreatestSum)
			nGreatestSum = nCurSum;
	}

	return nGreatestSum;
}

int main()
{

	int data[] = { 1, -2, 3, 10, -4, 7, 2, -5 };
	int result = FindGreatestSumOfSubArray(data, sizeof(data) / sizeof(int));
	if (g_InvalidInput == false)
		cout << "result:" << result << endl;
	else
		cout << "invalid input!" << endl;
	system("PAUSE");

	return 0;
}

结果:



版权声明:本文为博主原创文章,未经博主允许不得转载。

剑指Offer面试题31(java版):连续子数组的最大和

题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。 求所有子数组的和的最大值。要求时间复杂度为O(n) 例如输入的数组为{1,-2,3,1...
  • jsqfengbao
  • jsqfengbao
  • 2015年08月08日 21:42
  • 1360

连续子数组的最大和 动态规划实现

/* *copyright@nciaebupt 转载请注明出处 *问题:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。 *求所有子数组的和的最大值。要求时间负责度为...
  • wuwuwuwuwuwuwuwu
  • wuwuwuwuwuwuwuwu
  • 2013年01月08日 16:51
  • 2517

Java编程----连续子数组的最大和

本篇博客的编程是关于数组的,数组在编程中有着举足轻重的地位,因为在Java中数组是直接存储在栈中的,所以操作起来很方便,效率非常高,数组也是面试中经常考察的一部分,关于数组的编程题目丰富多样,逻辑性很...
  • sd_lucky
  • sd_lucky
  • 2016年08月04日 23:09
  • 2452

面试题31:连续子数组最大的和

1)      第一种方法 #include using namespace std; //为了区分是函数返回0还是输入不合法返回0设置一个变量判断 bool inputInvalid=false...
  • lom9357bye
  • lom9357bye
  • 2015年06月02日 12:00
  • 325

【算法拾遗】三种方法求连续子数组的最大和

这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典。 问题是这样的:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该子数组中各元素...
  • mmc_maodun
  • mmc_maodun
  • 2014年03月13日 00:09
  • 17915

面试题31:连续子数组的最大和

/*题目:输入一个整型数组,数组里有正数也有负数,数组中一个或连续的多个整数组成一个子数组。求所有子数组的和 的最大值。要求时间复杂度为O(n)。*/ #include using names...
  • hxysea
  • hxysea
  • 2013年09月30日 14:45
  • 617

面试题31: 连续子数组的最大和

一. 题目输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).代码请到我的代码库中下载 Point2Offer二. 代...
  • dingding_12345
  • dingding_12345
  • 2017年07月02日 09:14
  • 154

面试题31:连续子数组的最大和(java)

package findMax; /** * 连续子数组的最大和 * @author root * */ public class FindMax { static int[] data ...
  • Yan456jie
  • Yan456jie
  • 2016年03月05日 13:44
  • 515

连续子数组的最大和问题(一维和二维)To the Max (POJ 1050)

一维数组的连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 这是一个典型的D...
  • huanyingtianhe
  • huanyingtianhe
  • 2015年01月25日 16:35
  • 1164

面试题31:连续子数组的最大和(java)

package _31_findMaxArray; import java.util.Arrays; /** * 连续子数组的最大和 * 设b[i]表示以第i个元素a[i]结尾的最大子序列, ...
  • Yan456jie
  • Yan456jie
  • 2016年08月19日 16:45
  • 158
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:面试题31:连续子数组的最大和
举报原因:
原因补充:

(最多只允许输入30个字)