zoukankan      html  css  js  c++  java
  • 前缀和的应用(求最大连续子数组的和)

      Q:对于一个连续的数组,求其任意连续的子数组和的最大值。

    分析:

      1.对于此题,直接应用暴力求解的话,时间复杂度应为O(n^2).

      2.此处应用时间复杂度为O(n)的算法来求解,即前缀和的处理。

    首先,函数sum(i,j)表示数组从下标i到下标j的连续元素的和。容易想到:sum(i,j) = sum(0,j) - sum(0,i-1).所以求sum(i,j)的最大值就可以表示为求sum(0,j) - sum(0,i-1)

    的最大值问题。显然sum(0,j)的时间复杂度为线性的。只需求出最大的sum(0,j)与最小的sum(0,i-1),(其中j >= i)两者之差即所求结果。

    代码如下:

    //数组前缀和的处理
    #include <stdio.h>
    int a[]={1,2,3,-1,-2,5,6};
    int sum(int* arr)//求max(sum(0,j))
    {
        int m,max = a[0],sum = 0;
        int len = sizeof(a) / 4;
        int i = 1,j = 0;
        for( m = 0; m < len; m++)
        {
            sum += a[m];
            if(sum >= max)
            {
                max = sum;
                j = m;
            }
        }
        sum = 0,max = a[j];
        for( i = j; i >=0; i --)//从a[0]到a[j]中找出最大值,即sum(i,j)最大值
        {
            sum += a[i];
            if(sum >= max)
                max = sum;
    
        }
    
            return max;
    }
    int main()
    {
        printf("寻找数组a的最大连续子数组和:
    ");
        int res;
        res = sum(a);
        printf("结果为:%d
    ",res);
    
    
    }
    

      

    运行结果: 

     

  • 相关阅读:
    第四节 哈希类型
    第三节 string类型
    第二节 redis的数据类型和一些通用的键命令
    第一节 Redis的安装配置
    第三十二节 定时器
    第三十一节 sed命令
    第三十节 awk命令
    第二十九节 cut命令
    第二十八节 函数和脚本调试
    Gartner 如何看 RASP 和 WAF?
  • 原文地址:https://www.cnblogs.com/wangkundentisy/p/5975125.html
Copyright © 2011-2022 走看看