经典算法——连续子数组最大和问题

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [?2,1,?3,4,?1,2,1,?5,4],

the contiguous subarray [4,?1,2,1] has the largest sum = 6.

一、问题描述:输入一个整数数组,求数组中连续的子数组使其和最大。

二、解题方法:

//从左至右扫描数组,如果前面一段连续子数组的和小于0,则置为0,重新从下个元素开始累加
int maxSubArray(vector<int>& nums)
{
	int ans=nums[0];//注意:ans应该初始化为数组第一个元素
	int curSum=0;
	int n=nums.size();

	for(int i=0;i<n;i++)
	{
		curSum+=nums[i];

		if(curSum>ans)
			ans=curSum;

		if(curSum<0)
			curSum=0;
	}
	return ans;
}
时间: 2024-12-17 07:54:02

经典算法——连续子数组最大和问题的相关文章

经典算法——连续子数组的最大乘积

Maximum Product Subarray Find the contiguous subarray within an array (containing at least one number) which has the largest product. For example, given the array [2,3,-2,4], the contiguous subarray [2,3] has the largest product = 6.

编程算法 - 连续子数组的最大和 代码(C)

连续子数组的最大和 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个整型数组, 数组里有正数也有负数. 数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值. 使用一个数保存当前和, 如果当前和为小于0,  则替换新值, 否则, 递加, 使用一个数保存临时最大值. 代码: /* * main.cpp * * Created on: 2014年6月29日 * Author: wang */ #include <stdio

Maximum Subarray 连续子数组最大和

Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [−2,1,−3,4,−1,2,1,−5,4],the contiguous subarray [4,−1,2,1] has the largest sum = 6. More practice: If you have figur

连续子数组最大和(转)

求一个数组的相加和最大的连续子数组 思路: 一直累加,只要大于0,就说明当前的“和”可以继续增大, 如果小于0了,说明“之前的最大和”已经不可能继续增大了,就从新开始, result=max{result+arr[i],arr[i]};显然,若result>0,则可以继续相加,否则,就重新开始. #include<stdio.h> #define INF 65535 int Maxsum(int * arr, int size) { int maxSum = -INF; int sum

连续子数组最大和

题目来源:<剑指offer>面试题31.<编程之美>2.14 题目:输入一个整形数组,数组里有正数也有负数.数组中一个或连续多个整数组成一个子数组.求所有子数组的和的最大值 解法一:假设id代表自序列的一个起点,j代表终点.如果a[i]是负的,那么它不可能代表最优子序列的起点,因为任何包含a[i]的作为起点的子序列都可以通过a[i+1]作起点得到改进.类似地,任何负的子序列不可能是最优子序列的前缀.比如有数组{1,-2,3,10,-4,7,2,-5}.我们试着从头道尾逐个累加数组中

一维数组连续子数组最大和

题目描述 输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值. 输入描述 输入有多组数据,每组测试数据包括两行.第一行为一个整数n(0<=n<=100000),当n=0时,输入结束. 接下去的一行包含n个整数(我们保证所有整数属于[-1000,1000]). 输出描述 对应每个测试案例,需要输出一个整数单独一行,表示连续子向量的最大和. 输入样例 3 -1 -3 -2 输出样例 -1 测试代码 1 #include <stdio.h

动态规划求解连续子数组最大和问题(应该是新的描述方法?)

刚才看了下网上搜索到的TOP5使用动态规划解决此问题的代码,感觉没有突出动态规划的特点.所以自己思考了一番,提出如下解决方案: 首先再重复下动态规划的定义:将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息. 思考状态转移方程:设d[i]表示i个数形成的数组中最大的连续子数列和,数组arr[i] ,i=0...n-1; 那么d[i] 和 d[i-1]应该具备什么样的关系?显然,有两种情况, 一是arr[i]>0得到d[i] = max(

剑指offer第31题 连续子数组最大和

#include<iostream> using namespace std; int maxsum(int *list,int i) { if(list==NULL||i<=0) return -1; int cursum=0; int maxsum=0;//假设最小可以是0个数字 for(int j=0;j<i;j++) { if(cursum<=0) cursum=list[j]; else cursum=cursum+list[j]; if(cursum>max

【剑指offer】连续子数组最大和

思路dp很清楚,就是要注意细节. int FindGreatestSumOfSubArray(vector<int> array) { if(array.empty()) return 0; int sum = array[0], tempsum = array[0]; //注意初始值 不能设为0 防止只有负数 for(int i = 1; i < array.size(); i++) //从1开始 因为0的情况在初始化时完成了 { tempsum = (tempsum < 0)