• 输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组,要求时间复杂度为O(n)。


      如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和。不过非常遗憾的是,由于长度为n的数组有O(n2)个子数组(即:n + n-1 + ... + 1=n(n+1)/2);而且求一个长度为n的数组的和的时间复杂度为O(n)。因此这种思路的时间是O(n3)。

      上边这句话不是原创。

      我承认脑子比较笨,只把仨for嵌套的做出来了,时间复杂度为O(n)的,真的想不通,想了好久,好久,直到最后从网上搜到了这道题,才发现原来这道题真的挺难的,可这道题又非常简单,也就二三十行的代码。

    代码:

    package shuzu;

    import java.util.Random;
    import java.util.Scanner;

    public class shuzu {

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    int a[];
    int i,g,b=0,c=0;
    Scanner scanner = new Scanner(System.in);
    System.out.print("输出随机产生的数组的长度:");
    g=scanner.nextInt();
    a=new int[g];
    scanner.close();

    for(i=0;i<g;i++)
    {
    Random random = new Random();
    a[i]=random.nextInt(19);
    a[i]=a[i]-9;
    System.out.print(a[i]);
    System.out.print(" ");
    }System.out.println(" ");
    for(i=0;i<g;i++)
    {b=b+a[i];
    if(b<0)
    b=0;
    if(b>c)
    c=b;
    System.out.print(b);
    System.out.print(" ");
    }
    if(c==0)
    {c=a[0];
    for(i=0;i<g;i++)
    if(a[i]>c)
    c=a[i];}
    System.out.println("");
    System.out.print(c);
    }

    }

      程序思路也比较简单,从第一位开始累加,当累加和小于零时,设置为零,从下一位开始继续累加。并记录所有的累加和,取最大。如果最大和为零说明所有数均为负,直接取数组中的最大值做最大和。

  • 相关阅读:
    js写入和读取cookie
    算法笔记汇总精简版
    廖雪峰Git教程3
    廖雪峰Git教程2
    廖雪峰Git教程1
    PHP fastcgi_finish_request 方法
    PHP获取远程文件的大小,通过ob_get_contents实现
    PHP 浮点型运算相关问题
    php中的func_num_args、func_get_arg与func_get_args函数
    C# ListView用法详解
  • 原文地址:https://www.cnblogs.com/feifeishi/p/4361220.html
Copyright © 2020-2023  润新知