子数组最大累加和(有正有负)

 1 /*
 2 [1,-2,3,5,-2,6,-1];  最大子数组为[3,5,-2,6] 和为12,并且能标记处最大子数组的范围
 3 */
 4
 5
 6 #include "stdafx.h"
 7 #include <iostream>
 8
 9 using namespace std;
10
11 void maxSum(int* arr,int len)
12 {
13     if(arr == NULL || len == 0)//合法性判断
14         return ;
15
16     int cursum = 0;            //记录遍历过程中的当前和
17     int maxmark = 0x80000000;  //记录最大和
18     int begin = 0;             //标记和为最大子数组的开始位置
19     int end = 0;               //标记和为最大子数组的结束位置
20
21     for(int i = 0; i < len; i++)
22     {
23         cursum += arr[i];
24         if(cursum <= 0)
25         {//当前和为0,则以下一个位置重新开始
26             cursum = 0;
27             begin = i+1;//标记开始位置
28         }
29
30         maxmark = max(maxmark,cursum);
31                  //每一步都记录最大值,保证maxmark不减少
32
33         if(maxmark == cursum)
34             end = i;
35               //向后可能和值还继续大于0,但是已经小于已有的maxNum,                           //end到此结束。
36     }
37     cout<<begin<<" "<<end<<" "<<maxmark<<endl;
38 }
39
40 int _tmain(int argc, _TCHAR* argv[])
41 {
42     int arr[] = {1,-2,3,5,-2,6,-1};
43     maxSum(arr,7);
44     system("pause");
45     return 0;
46 }
47                     

时间: 2024-08-24 20:28:44

子数组最大累加和(有正有负)的相关文章

求连续子数组的最大和

一.题目: 这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典. 问题是这样的:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该连续子数组中各元素的和最大,这个连续子数组便被称作最大连续子数组.比如数组{2,4,-7,5,2,-1,2,-4,3}的最大连续子数组为{5,2,-1,2},最大连续子数组的和为5+2-1+2=8. 二.解法: 解法一:暴力求解法 /* (1) 常规方法,时间复杂度O(n*n) (2) 先从第一个元素开始向后

最大连续子数组算法学习

作为零基础学习的弱智艰难的入行后,在黑暗中摸爬滚打中过了几个月,才想起应该开个博客记录下自己的学习历程和整理知识点.刚刚接触算法的我,博客就以记录我的算法学习历程为开端吧.多说无益,下面开始: 如果已知后三十天的股票涨跌停的情况,那么我该如何确定自己收益的最大值是多少呢?这里可以将股票每天的变化存进一个数组里,涨记为正,跌记为负,那么最后这个实际问题就转化为了求最大连续子数组的问题了,即我怎么切割这个数组使得这个数组里的值最大?这里简单的用了分治法去计算,首先将data分成2份,一份为左data

数对之差的最大值 &amp;&amp; 子数组的最大和

问题1: 在数组中,数字减去他的右边的数字得到一个数对之差,求所有数对之差的最大值. 例如数组{2.4.1.16.7.5.11.9}中,数对之差的最大值是11,是16减去5的结果. 问题2:给定一个含有n 个元素的数列,元素有正有负,找出和最小的一组相邻的书,既给定a[n],是的a[i]+a[i+1]+...+a[j]的和最小. 先看第一道题目: 如果从头遍历,遍历到某一个位置,从这个位置开始遍历到数组结束,看此元素的数对只差的最带值,然后更行当前的数对之差的最大值,O(n^2)的事件复杂度.

Algorithm One Day One--求输入的数组其子数组的最大值

算法是编程的灵魂,是编程思想的精髓----Algorithm One Day One /******************************************************************** created:2015年1月19日 00:20:59 author: Jackery T(n)=Ο(n) purpose: 本程序是求输入的一个数组,求其子数组的最大值: **************************************************

一维数组子数组最大和

题目:返回一个一维整数数组中最大子数组的和. 要求: 输入一个一维整形数组,数组里有正数也有负数. 一维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 设计思想: 生成数组,生成子数组,求和,求最大值. 代码: package bao; import java.util.*; public class Msum { public static void main(String args[]) { Scanne

lintcode循环数组之连续子数组求和

v 题目:连续子数组求和 II 给定一个整数循环数组(头尾相接),请找出一个连续的子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.如果多个答案,请返回其中任意一个. v 样例 给定 [3, 1, -100, -3, 4], 返回 [4,0]. v 思路 1.如果不是循环数组,求解连续子区间和的思路如下: 首先设一个累加变量和sum和最大值变量maxN,[ld, rd]表示当前正在累加的区间,[lt,rt]表示最大和的区间.从左边开始一直累加,并初始当前区间[ld

连续子数组最大和

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

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

题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组. 求所有子数组的和的最大值.要求时间复杂度为O(n) 例如输入的数组为{1,-2,3,10,-4,7,2,-5} 看到该题目,很多人都能想到最直观的方法,即枚举出数组的所有子数组并求出他们的和.一个长度为n的数组,总共有n(n+1)/2个子数组.计算出所有的子数组的和,最快也需要O(n2)的时间.通常最直观的方法不会是最优的方法,面试官将提示我们还有更快的方法. 解法一:举例分析数组的规律: 我们试着从头尾逐

[nowCoder] 子数组最大乘积

给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积.例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12. 分析,是一个dp的题目, 设f[i]表示以i为结尾的最大值,g[i]表示以i结尾的最小值,那么 f[i+1] = max{f[i]*arr[i+1], g[i]*arr[i+1],arr[i+1]} ,只有这三种情况. 考虑到f[i],g[i]只和i-1有关,那么可以用局部变量即可搞定,