zoukankan      html  css  js  c++  java
  • 输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组,要求时间复杂度为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);
    }

    }

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

  • 相关阅读:
    再学 GDI+[11]: DrawCurve 绘制曲线
    再学 GDI+[7]: DrawLines 绘制一组直线
    再学 GDI+[9]: DrawPolygon 绘制多边形
    再学 GDI+[10]: DrawClosedCurve 绘制闭合曲线
    再学 GDI+[13]: DrawBezier 绘制贝塞尔线
    再学 GDI+[8]: DrawRectangles 绘制一组矩形
    再学 GDI+[5]: DrawArc 绘制弧线
    再学 GDI+[12]: 准备工作 矩形命中
    再学 GDI+[6]: DrawPie 绘制饼形
    判断字符串中子串个数的函数
  • 原文地址:https://www.cnblogs.com/feifeishi/p/4361220.html
Copyright © 2011-2022 走看看