zoukankan      html  css  js  c++  java
  • 返回整数数组最大子数组之和

    题目:返回整数数组最大子数组之和

    要求:输入一个整形数组,数组里有正数也有负数

         数组里连续的一个或多个整数组组成一个子数组,每个子数组都有一个和

         求所有子数组的和的最大值。要求时间复杂度为O(n)

       

    设计思想:从第二个数开始,如果这个数加上前一个数大于这个数的值,令这个数的值等于这个数加上前一个数。从得到数组的第一个数开始比较,输出值最大的数

    出现的问题:无

    源代码

    #include<iostream>
    using namespace std;
    int main()
    {
        int a[100],n;
        cin >> n;
        for(int i = 0; i < n; i++)
            cin >> a[i];
        for (int i = 1; i < n; i++)
        {
            if (a[i] + a[i - 1] > a[i])
                a[i] = a[i] + a[i - 1];
        }
        int ans = -100000;
        for (int i = 0; i < n; i++)
        {
            if (a[i] > ans)
                ans = a[i];
        }
        cout << ans << endl;
        system("pause");
        return 0;
    }

    结果截图

     

     

    环形数组

    设计思想:将a[0]~a[n-1]赋给a[n]到a[2n-1],和普通数组一样从第二个数开始比较并保证比较次数小于输入数组的个数,输出最大值。

    出现的问题:一个数被取值两次,通过控制比较次数小于数组个数得到解决

    源代码:

    #include<iostream>
    using namespace std;
    int main()
    {
        int a[100],n,sum=0,j=0;
        cin >> n;
        for(int i = 0; i < n; i++)
            cin >> a[i];
        for (int i = 0; i < n; i++)
        {
            a[n + i] = a[i];
        }
        for (int i = 1; i < 2 * n; i++)
        {
            if ((a[i] + a[i - 1] > a[i])&&j<n)
            {
                a[i] = a[i - 1] + a[i];
                j++;
            }
        }
        int m=a[0];
        for (int i = 0; i < 2 * n; i++)
        {
            if (a[i] > m)
                m = a[i];
        }
        cout << m << endl;
        system("pause");
        return 0;
    }

    测试结果:

     

  • 相关阅读:
    php模式设计之 工厂模式
    SDK以及部署的SDK的思路
    手机用fiddler抓包开发测试
    搭建GIT服务端
    TP5.0以上数据库增加数据异常
    lnmp一键安装后的配置改动建议
    TPshop5最新版 安装 nginx 开启PATHINFO 模式资源加载路径加载失败问题,适用tp3.2PATHINFO模式REWRITE模式
    jquery写拉动条
    JS(JQ)分页 个人查看,没注释
    ecshop 分页
  • 原文地址:https://www.cnblogs.com/songxinai/p/12373481.html
Copyright © 2011-2022 走看看