如何求陣列連續最大和 四種方法

2021-10-25 01:11:37 字數 3460 閱讀 8348

乙個有n個元素的陣列,則n個元素既可以是正數也可以是負數,陣列中連續的乙個或多個元素可以組成乙個連續的子陣列,乙個陣列可能有多個這種連續的子陣列,求子陣列和的最大值。

分析:最簡單的也是最容易的方法就是找出所有的子陣列,然後求出陣列的和,在所有子陣列的和中取最大值。

package lock;

public

class

t5int thissum=

0,maxsum=

0,i,j,k;

for(i=

0;ireturn maxsum;

}public

static

void

main

(string[

] arg)

; system.out.

println

("連續最大的和為:"

這種演算法的時間複雜度為o(n^ 3),顯然效率太低,通過這種演算法進行分析發現,許多子陣列都重複計算了。

由於sum[i,j]=sum[i,j-1]+arr[j],在計算sum[i,j]時可以使用前面已經計算出的sum[i,j-1]而不需要重新計算,採用這種方法可以省去sum[i,j-1]的時間,因此可以提高程式的效率,節省運算時間。

package lock;

public

class

t6int maxsum=integer.min_value;

for(

int i=

0;i}return maxsum;

}public

static

void

main

(string[

] args)

; system.out.

println

("連續最大的和為:"

這種方法是用來雙重迴圈,因此,時間複雜度為o(n^ 2)。

可以採用動態規劃的方法來降低演算法的時間複雜度。

首先可以根據陣列的最後乙個元素arr[n-1]與最大子陣列的關係分為以下三種情況討論:

1)最大陣列包含arr[n-1],即最大陣列以arr[n-1]結尾。

2)arr[n-1]單獨構成最大陣列。

3)最大陣列不包括arr[n-1],那麼arr[1…n-1]的最大子陣列可以轉化為arr[1…n-2]的最大子陣列。

package lock;

public

class

t7int n=arr.length;

int[

]end=

newint

[n];

int[

]all=

newint

[n];

end[n-1]

=arr[n-1]

; all[n-1]

=arr[n-1]

; end[0]

=all[0]

=arr[0]

;for

(int i=

1;i++i)

return all[n-1]

;}public

static

void

main

(string[

] args)

; system.out.

println

("連續最大的和為:"

+maxsubarray

(arr));

}}

可以定義兩個變數來儲存end[i-1]與all[i-1],並且可以重複利用。

package lock;

public

class

t8int nall=arr[0]

;//最大子陣列和

int nend=arr[0]

;//包含最後乙個元素的最大子陣列和

for(

int i=

1;i++i)

return nall;

}public

static

void

main

(string[

] args)

; system.out.

println

("連續最大的和為:"

這種方法在保證了時間複雜度為o(n)的基礎上,把演算法的空間複雜度也降到o(1)。

在知道子陣列最大值後,如何才能確定最大子陣列的位置

為了得到最大子陣列的位置,首先介紹另外一種最大子陣列和的方法。通過公式end[i]=max(end[i-1]+arr,arr[i])的分析可以看出,當end[i-1]<0時,end[i]=array[i],其中end[i]表示包含array[i]的陣列和,如果某乙個值使得end[i-1]<0,那麼就從arr[i]重新開始。可以利用這個性質非常容易地確定最大子陣列的位置。

package lock;

public

class

t9else

if(nsum>maxsum)

}return maxsum;

}public

intgetbegin()

public

intgetend()

public

static

void

main

(string[

] args)

; system.out.

println

("連續最大的和為:"

+t.maxsubarray

(arr));

system.out.

println

("最大和對應的陣列起始與結束座標分別為:"

js求陣列最大值的四種方法

let arr 3,56,0,21,7,39 1.遍歷陣列每一項與當前最大值比較 array.prototype.max function return max 2.sort 排序,a b公升序,b a降序 let max arr.sort a,b 0 注意 若arr.sort 不帶引數,則按照字元...

求陣列中連續子陣列的最大和

思路 計算出任意i到j之間連續子陣列的和再比較必然能得到最大值,但時間複雜度為o n 2 我們希望能找出線性時間的演算法。我們注意到,假如陣列中全為正數,那麼最大和必然為全部數相加 如果陣列中有負數,並且如果加上某個負數,子陣列的和小於0,則最大和子陣列必然不包含這個負數。基於此,給出以下 incl...

演算法題 求陣列中 連續子陣列最大和

程式設計題 連續最大和 乙個陣列有 n 個元素,求連續子陣列的最大和。例如 1,2,1 和最大的連續子陣列為 2,1 其和為 3 輸入描述 輸入為兩行。第一行乙個整數n 1 n 100000 表示一共有n個元素 第二行為n個數,即每個元素,每個整數都在32位int範圍內。以空格分隔。輸出描述 所有連...