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

}

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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



猜您在找 输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)的最大和。要求时间复杂度为O(n)(解决) 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n) 输入一个整型数组,数组里有正数,也有负数。求所有子数组的和的最大值 [java实现]找一个数组的最大和的连续子数组(时间复杂度 O(n)) 两个有序数组合并成一个有序数组(要求时间复杂度为O(n)) 给定一个无序的整数类型数组,求最长的连续元素序列的长度。 例如: 给出的数组为[100, 4, 200, 1, 3, 2], 最长的连续元素序列为[1, 2, 3, 4]. 返回这个序列的长度:4 你需要给出时间复杂度在O(n)之内的算法 给定一个整数数组 nums 和一个目标值 k,请实现一个方法判断 nums 中是否存在某个片段(即若干个相连元素)之和等于 k。要求时间复杂度为 O(n)。 Leetcode练习(Python):数组类:第128题:给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。 给定一个长度为N的数组,找出出现次数大于n/2,n/3的数,要求时间复杂度O(n),空间复杂度O(1) 一个整形数组中有正数也有负数,数组中连续一个或多个组成子数组,每个子数组都有一个和,求所有子数组中和的最大值
 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM