Maximum Subarray

Dynamic Programming

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 figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.

C++实现代码:

#include<iostream>
#include<climits>
using namespace std;

class Solution {
public:
    int maxSubArray(int A[], int n) {
        if(n==0)
            return 0;
        int maxSum=0;
        int sum=0;
        int i;
        int max=INT_MIN;
        for(i=0;i<n;i++)
        {
            if(A[i]>=0)
               break;
            if(A[i]>max)
                max=A[i];
        }
        if(i>=n)
            return max;
        for(i=0;i<n;i++)
        {
            sum+=A[i];
            if(maxSum<sum)
            {
                maxSum=sum;
            }
            if(sum<0)
                sum=0;
        }
        return maxSum;
    }
};

int main()
{
    Solution s;
    int A[10]={-2,-3,-8,0};
    cout<<s.maxSubArray(A,10)<<endl;
}

注意:其中至少包含一个数,所以当全是负数时,只能返回最大的负数。。

时间: 2024-10-30 16:40:59

Maximum Subarray的相关文章

[LeetCode]53.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. click to show more practic

Maximum Subarray Algorithm

算法导论4.2-5提供了一种线性时间内解决的方法. 思路是,最大子串有一个特性,从前向后逐个累加,过程中和始终为正.这是因为如果计算到某个数,和为负,则去掉包括这个数的前面这部分,剩下的子串和会更大,这和之前认为的最大子串是冲突的. 因此从前往后逐个累加求和,如果和为负,则从下一个开始重新累加.在这个过程中找出和的最大值即可. package cpt4; import Utils.P; public class Ex1s5 { /** * find max subarray in O(n) *

UVa 11827 Maximum GCD:gcd&amp;amp;读入技巧

11827 - Maximum GCD Time limit: 1.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2927 Given the N integers, you have to find the maximum GCD(greatest common divisor) o

算法研究:最大子序列求和问题的解决方案

The maximum subarray problem is the task of finding the contiguous subarray within a one-dimensional array of numbers (containing at least one positive number) which has the largest sum. For example, for the sequence of values ?2, 1, ?3, 4, ?1, 2, 1,

【技术小火车】万万没想到!原来你是这样的算法君?!

据说算法正在统治世界?吓得我瓜子都掉了......好吧无稽之谈,你们的神之蔑视脸我先收下了,谁让人家单纯无邪天真可爱说啥信啥呢.别闹了,赶紧言归正传(严肃脸).虽然没有那么可怖,但是算法的作用自然不必多说.毕竟无论男男女女老老少少,想在计算机这条道路上走得更远,算法都是不可或缺的. 然而算法千千万,又有哪些算法属于"夜空中的那颗星"呢?本文就带领大家驰骋算法世界,为你展现丰富而又独特的算法之美.简言之嘛,就是咱们一起攻略新副本去!那走着?走啥走,赶紧飞吧!前方一大波福利来袭,千万要Ho

[经典面试题][淘宝]求首尾相连数组的最大子数组和

题目 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相连的.数组中一个或多个连续元素可以组成一个子数组,其中存在这样的子数组arr[i],-arr[n-1],arr[0],-,arr[j],现在请你这个ACM_Lover用一个最高效的方法帮忙找出所有连续子数组和的最大值(如果数组中的元素全部为负数,则最大和为0,即一个也没有选). 输入: 输入包含多个测试用例,每个测试用例共有两行,第一行是一个整数n(1<=n<= 100000),表示数组的长度

编程之美之2.14 求数组的子数组之和的最大值

[题目] 一个有N个整数元素的一维数组(A[0],A[1],A[2],...A[n-1]),这个数组中当然有很多子数组,那么子数组之和的最大值是多少? 该子数组是连续的. 我们先来明确一下题意: (1)子数组意味着是连续的. (2)题目只需要求和,并不需要返回子数组的具体位置. (3)数组的元素是整数,所以数组可能包含正整数,负整数或者零. 举几个例子: 数组:[1,-2,3,5,-3,2]返回8  数组:[0,-2,3,5,-1,2]返回9 数组:[-9,-2,-3,-5,-3]返回8 [解法

【算法】2 由股票收益问题再看分治算法和递归式

回顾分治算法 分治算法的英文名叫做"divide and conquer",它的意思是将一块领土分解为若干块小部分,然后一块块的占领征服,让它们彼此异化.这就是英国人的军事策略,但我们今天要看的是算法. 如前所述,分治算法有3步,在上一篇中已有介绍,它们对应的英文名分别是:divide.conquer.combine. 接下来我们通过多个小算法来深化对分治算法的理解. 二分查找算法 问题描述:在已排序的数组A中查找是否存在数字n. 1)分:取得数组A中的中间数,并将其与n比较 2)治:

leetcode难度及面试频率

转载自:LeetCode Question Difficulty Distribution               1 Two Sum 2 5 array sort         set Two Pointers 2 Add Two Numbers 3 4 linked list Two Pointers           Math 3 Longest Substring Without Repeating Characters 3 2 string Two Pointers