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


    对于一个有N个元素的数组,a[0]~a[n-1],求子数组最大值。

    如:数组A[] = [−2, 1, −3, 4, −1, 2, 1, −5, 4],则连续的子序列[4,−1,2,1]有最大的和6.

    方法一:暴力

    循环遍历,输出所有,判断最大的和

     1 #include"iostream"
     2 #define MAX 1001
     3 using namespace std;
     4 
     5 int main(){
     6     int n, a[MAX], sum , maxsum ;
     7 
     8     cin >> n;
     9     for (int i = 0; i<n; i++)
    10     {
    11         cin >> a[i];
    12     }
    13     maxsum = a[0];
    14 
    15     for (int i = 0; i<n; i++)
    16     {
    17         sum = 0;
    18         for (int j = i; j<n; j++)
    19         {
    20             sum += a[j];
    21             if (maxsum<sum)
    22                 maxsum = sum;
    23         }
    24     }
    25     cout << maxsum;
    26 
    27 }

    需要注意的是,数组可能全负{-1,-2,-3,-4},最大为-1.

    时间复杂度O(n^2)

    方法二:

    遍历数组,依次判断数组中的每一个元素的值 将其与0作比较,
    如果其大于等于0,
        再判断之前子数组的和是否大于0,
        如果之前子数组的和小于0,
            则当前元素即为当前子数组之和。
        如果之前子数组之和大于0,
            则将当前元素与之前子数组之和相加,相加之和作为当前子数组之和。
    如果其小于0
        判断Max是否大于等于0
        如果Max大于等于0
            则将当前元素与之前子数组之和相加,相加之和作为当前子数组之和,跳过循环
        如果Max小于0
            当前子数组之和即为当前元素
    
    将当前子数组之和与最大值Max作比较
    如果其大于最大值,则更新
     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     int n, s[10], sum, Max;
     8 
     9     cin >> n;
    10     for(int i = 0; i < n; ++i)
    11         cin >> s[i];
    12 
    13     for(int i = 0; i < n; ++i)
    14     {
    15         if(i == 0)
    16             Max = sum = s[i];   //将sum和Max初始化为数组中的第一个元素的值。
    17         else
    18         {
    19             if(s[i] >= 0)
    20             {
    21                 if(sum <= 0)
    22                     sum = s[i];
    23                 else
    24                     sum = sum + s[i];
    25             }
    26             else
    27             {
    28                 if(Max >= 0)
    29                 {
    30                     sum = 0;
    31                     continue;
    32                 }
    33 
    34                 else
    35                     sum = s[i];
    36             }
    37 
    38             if(sum > Max)
    39                 Max = sum;
    40         }
    41     }
    42     cout << "max = " << Max << endl;
    43     return 0;
    44 }

    时间复杂度为O(n)。

  • 相关阅读:
    [golang]text/template模板
    [golang]Go内嵌静态资源go-bindata的安装及使用
    GoCN每日新闻(2019-09-23)
    spring mvc中获取请求URL
    HBuilder搭配逍遥Android模拟器进行开发
    python 数据结构
    JDK8+Tomcat8配置https【转】
    JFinal的使用
    RESTful API 设计指南【转】
    jQuery验证控件jquery.validate.js的使用介绍
  • 原文地址:https://www.cnblogs.com/SeekHit/p/5568339.html
Copyright © 2020-2023  润新知