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);
    }

    }

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

  • 相关阅读:
    网络图片获取工具类
    压缩、解压工具类
    字符串排序简单的工具类,数组转list,list转数组
    mysql 实现 sqlserver的row_number over() 方法
    Mysql安装配置及常见问题解决
    Mysql数据库主从配置
    PageHelper:在系统中发现了多个分页插件,请检查系统配置
    Kibana-Elasticsearch分析工具
    Elasticsearch基础环境配置和使用
    取消IDEA双击shift时出现的全局搜索
  • 原文地址:https://www.cnblogs.com/feifeishi/p/4361220.html
Copyright © 2011-2022 走看看