zoukankan      html  css  js  c++  java
  • 时间复杂度为n的求最大子数组的方法

    题目:时间复杂度为n的求最大子数组 

    成员:马国彬,李小超

    这道题相对来说比较简单,我和我的搭档李小超在上课时很快就完成了,主要是用了两层for循环进行比较,但是跟老师交流之后,老师对我们的时间复杂的提出了要求,我们的时间复杂度为n方,而不是n,下课之后,我和李小超经过一晚上的思考,想出了解决的方案,我们两个人各想出了一个程序,大体思路差不多,这里给上我的程序并做分析。

    // 最大数组2.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    int main(int argc, char* argv[])
    {
        int a[5]={7,87,-14,15,7};
        int i;
        int max=a[4];
        for(i=0;i<4;i++)
        {
            if(a[i]>max)
                max=a[i];
        }
        for(i=4;i>0;i--)
        {
            if(a[i]>0)
            {
    
                a[i-1]=a[i-1]+a[i];
                if(max<a[i-1])
                    max=a[i-1];
                if(a[i-1]<=0)
                {
                    i--;
    if(max<a[i-1] max
    =a[i-1]; } } } printf("%d",max); return 0; }


    首先将数组的最后一个数赋给max,然后将max与每一个数进行比较,如果比数组小, 则交换。然后通过一个for循环,开始查找最大字数组。我是从数组组后一个开始倒着逼得,首先看当前数组也就是最后一个是否大于0,如果大于,就给前一个数加上当前数。再与max比较。若大于max则交换。然后将前一个数与0比较,如果小于0,说明这两个数相加较小,是个负值,这样就将这两个数舍去,因为是负的,只会使和更小。因为之前已经给前一个数加上了当前的数了,为了使这两个数都能舍去,给一个i--,这样,当for循环执行了一次之后,又给了一个i--,这样就跳了两次,把之前的两个要舍去的数都跳过去了。同时,为了使max准确表示当前最大字数组的和,在i--之后,加一个max=a[i-1];

    通过几次循环之后,就能得到最大的max,同时,这也是线性的,时间复杂度较低。

  • 相关阅读:
    机器学习之——正规方程法
    机器学习之——学习率
    机器学习之梯度下降法
    机器学习之线性回归算法
    集体智慧编程学习笔记——第一讲
    机器学习之归一化和标准化总结
    推荐系统实战-学习笔记第一章
    洛谷P1396 营救 题解
    洛谷P3905 道路重建
    洛谷P2384 最短路 题解
  • 原文地址:https://www.cnblogs.com/maguobin/p/3592985.html
Copyright © 2011-2022 走看看