乙個有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範圍內。以空格分隔。輸出描述 所有連...