zoukankan      html  css  js  c++  java
  • 求数组中连续子数组的最大和

     

    问题:

         求解数组中连续一段子数组和的最大值。例如:{31,-41,59,26,-53,58,97,-93,-23,84},最大值为59+26-53+58+97=187

    思路:

      计算出任意i到j之间连续子数组的和再比较必然能得到最大值,但时间复杂度为O(n^2),我们希望能找出线性时间的算法。

          我们注意到,假如数组中全为正数,那么最大和必然为全部数相加;如果数组中有负数,并且如果加上某个负数,子数组的和小于0,则最大和子数组必然不包含这个负数。 基于此,给出以下代码:

         

    复制代码
    //计算数组中任何连续子数组的最大和
    #include <stdio.h>
    
    int getMaxValue(int data[],int length)
    {
        int max = 0,temp = 0;
        int i =0;
        for(i=0;i<length;i++)
        {
            temp = temp + data[i];
            if(temp < 0)
                temp = 0;
            else
            {
                if(temp > max)
                    max = temp;
            }
    
    
        }
        return max;
    }
    
    int main()
    {
        int data[] = {31,-41,59,26,-53,58,97,-93,-23,84};
        int length = sizeof(data) / sizeof(int);
        int max = getMaxValue(data,length);
        printf("%d",max);
    }
    复制代码
  • 相关阅读:
    java中的object类
    java中super的使用
    java中final的使用
    java中的继承初始化顺序
    java中的方法重写
    springMVC的流程
    dubbo与zookeeper
    java的几种常见数据结构
    集合框架之List和Set区别
    集合框架
  • 原文地址:https://www.cnblogs.com/gylhaut/p/5509925.html
Copyright © 2011-2022 走看看