1. 程式人生 > >返回一個整數數組中最大子數組的和(可視化)

返回一個整數數組中最大子數組的和(可視化)

for turn row 也有 exception except system.in next arr

要求

1.輸入一個整型數組,數組裏有正數也有負數。

2.數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。

3.求所有子數組的和的最大值。要求時間復雜度為O(n)。

4.要求輸出運算過程

源代碼

package one_simple;

import java.util.Scanner;

public class VisualFindMaxArray {

    public static void main(String[] args) throws InterruptedException {
        System.out.println(
"算法思路是首先將數組中相鄰且正負相同的數相加算出數塊,然後根據數塊計算最大子數組的和\n"); Scanner sc = new Scanner(System.in); System.out.print("請輸入數組的長度:"); int length = sc.nextInt(); System.out.print("請輸入"+length+"個數:"); int[] a = new int[length]; for(int i=0;i<length;i++) a[i]
= sc.nextInt(); sc.close(); System.out.println(); /*錄入結束*/ int[] b = new int[length]; //數塊數組 String[] c = new String[length]; //記錄數塊數組中每一個數塊的組成 for(int i=0;i<length;i++) c[i] = ""; b[0] = a[0]; c[0] = "1 "; int j=0,max,maxnum=0;
for(int i=1;i<10;i++) { if(a[i]<0 && b[j]>0) { b[++j] = a[i]; c[j] += (i+1)+" "; } else if(a[i]>0 && b[j]<0) { b[++j] = a[i]; c[j] += (i+1)+" "; } else if(a[i]<=0 && b[j]<0) { b[j] += a[i]; c[j] += (i+1)+" "; } else if(a[i]>=0 && b[j]>0) { b[j] += a[i]; c[j] += (i+1)+" "; } } String[] s1,s2; for(int i=0;i<=j;i++) { s1 = c[i].split(" "); if(s1.length==length) { System.out.println("第1個數塊大小為"+b[i]+",是所有數的和,則最大子數組的和為數組的最大數"); max=a[0]; for(i=1;i<length;i++) if(max<a[i]) max=a[i]; System.out.println("最大子數組的和為:" + max + ",位置為第"+(i++)+"個數"); return; } else if(s1.length==1) System.out.println("第"+(i+1)+"個數塊為第"+s1[0]+"個數:"+b[i]); else System.out.println("第"+(i+1)+"個數塊為第"+s1[0]+"到第"+s1[s1.length-1]+"個數的和:"+b[i]); } max=b[0]; for(int i=0;i<=j;i++) if(max<b[i]) { max=b[i]; maxnum=i; } int t=0; int first = maxnum,last = maxnum; for(int i=maxnum;i>=2;i-=2) { //從最大數塊所在位置向左運算 t=t+b[i-1]+b[i-2]; //最大數塊左方的數塊和,如果存在大於0的,則可以加入最大子數組和的運算 if(t>0) { max+=t; first=i-2; t=0; } } t=0; for(int i=maxnum;i<=j-2;i+=2) { //從最大數塊所在位置向右運算 t=t+b[i+1]+b[i+2]; //最大數塊右方的數塊和,如果存在大於0的,則可以加入最大子數組和的運算 if(t>0) { max+=t; last=i+2; t=0; } } System.out.print("\n最大子數組的和為:" + max); s1=c[first].split(" "); s2=c[last].split(" "); System.out.println(",是第"+s1[0]+"個數到第"+s2[s2.length-1]+"個數的和"); } }

運行截圖

技術分享圖片

返回一個整數數組中最大子數組的和(可視化)