輸入一個整型數組,數據元素有正數也有負數,求元素組合成連續子數組之和最大的子數組,要求時間復雜度為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刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM