zoukankan      html  css  js  c++  java
  • 最大子数组和

    题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间负责度为O(n)。

      看到这个题目,我们首先想到的是求出这个整型数组所有连续子数组的和,长度为n的数组一共有 n(n+2)/2个子数组,因此要求出这些连续子数组的和最快也需要O(n^2)的时间复杂度。但是题目要求的O(n)的时间复杂度,因此上述思路不能解决问题。

    使用动态规划方法

      解体思路:如果用函数f(i)表示以第i个数字结尾的子数组的最大和,那么我们需要求出max(f[0...n])。我们可以给出如下递归公式求f(i)

      这个公式的意义:

    1. 当以第(i-1)个数字为结尾的子数组中所有数字的和f(i-1)小于0时,如果把这个负数和第i个数相加,得到的结果反而不第i个数本身还要小,所以这种情况下最大子数组和是第i个数本身。
    2. 如果以第(i-1)个数字为结尾的子数组中所有数字的和f(i-1)大于0,与第i个数累加就得到了以第i个数结尾的子数组中所有数字的和。

    代码实现

    复制代码
    //使用动态规划求最大连续子数组和
    int FindGreatestSumOfSubArray2(int arry[],int len,int c[])
    {
        c[0]=arry[0];
        int start,end;
        int temp=0;
        int maxGreatSum=-100;
        for(int i=1;i<len;i++)
        {
            if(c[i-1]<=0)
            {
                c[i]=arry[i];
                temp=i;
            }
            else
                c[i]=arry[i]+c[i-1];
            if(c[i]>maxGreatSum)
            {
                maxGreatSum=c[i];
                start=temp;
                end=i;
            }
        }
        //输出c[i]
        for(int i=0;i<len;i++)
            cout<<c[i]<<" ";
        cout<<endl;
    
        cout<<"最大子序列位置:"<<start<<"--"<<end<<endl;
        return maxGreatSum;
    }
    复制代码

      其实上述两种方法的实现方式非常相似,只是解体思路不同而已。通常我们会使用递归的方式分析动态规划的问题,但是最终都会基于循环去写代码。在动态规划方法中创建了一个数组c[]用于存储中间结果,而第一种方法中只需要一个临时变量currSum.

  • 相关阅读:
    QuantLib 金融计算——案例之固息债的关键利率久期(KRD)
    Elasticsearch 最佳运维实践
    Ansible常用的Ansible Module
    中国七夕节( Chinese Valentine's Day)IT的浪漫情结
    Leetcode之C++刷题生死战
    无需Root可自动定时发送微信和短信的黑科技APP,支持跳过开屏启动广告
    tmp
    【整理中】可靠性基础_抽样检测
    【汇总】命名及标识
    Treelist父节点上下移
  • 原文地址:https://www.cnblogs.com/wxgblogs/p/5790596.html
Copyright © 2011-2022 走看看