最大子串行和

2021-08-15 17:43:53 字數 1793 閱讀 3275

------------------------------------maxsubsum.go------------------------------------------

package maxsubsum

// 問題描述:最大子串行和

// 給定(有可能為負的)整數a1a2,...,an,求sum(ai,...,aj)最大值(如所有整數均為負數,則最大子串行和為0)

// -2,11,-4,13,-5,-2,答案為20(從a2到a4)

// 暴力列舉所有情況 時間複雜度 o(n^2) 空間複雜度 o(1)

func maxsubsum1(arr int) (max int) }}

return

}// 使用遞迴 將陣列中間拆分,最大值可能出現在左半部分,或者右半部分,或者跨越左右兩部分

// 時間複雜度 o(nlogn) 空間複雜度 o(n)

func maxsubsum2(arr int) (max int)

if size == 1

return

} // 遞迴計算左右兩部分的最大值

center := size / 2

maxsumleft := maxsubsum2(arr[0:center])

maxsumright := maxsubsum2(arr[center:])

// 計算可能跨越左右兩部分的最大值

// 從中間切分點向左,向右分別計算最大值,二者之和為跨越中點的最大值

var leftmaxsum, lefttempmaxsum int

for i := center - 1; i > -1; i--

}var rightmaxsum, righttempmaxsum int

for i := center; i < size; i++

}maxsumcenter := leftmaxsum + rightmaxsum

// 從左最大值,右最大值,中間最大值中選擇最大值為最終結果

if maxsumleft > maxsumright else

} else else

}}// 優化過的演算法

// 從左到右依次掃瞄求和,如果某值為負數,其不可能為序列的起始,繼續判斷下乙個值;某個子串行的和<0,則該序列不可能為最大和子串行的一部分

// 時間複雜度 o(n 空間複雜度 o(1)

func maxsubsum3(arr int) (max int)

if tmpsum < 0

}return

}

--------------------------------------------maxsubsum_test.go-----------------------------------------------

package maxsubsum

import (

"testing"

"math/rand"

"time"

"fmt"

)type data struct

var data = data, 20},

, 11},

}func testmaxsubsum(t *testing.t) }}

}func testlargescale(t *testing.t)

arr[i]=rand.intn(1000)*flag

}for i,f:=range func(int)int

}

和最大子串行

問題描述 第一行輸入乙個正整數n 1 n 100001 第二行輸入n個整數a 0 a 10000 求該組整數子串行最大的和。解決這個問題應該考慮輸入n較大的情況,也就是說,輸入100000個數字判斷它的和最大子串行應當也能很快地算出來。我看過很多求解的 有三重for迴圈的,有兩重for迴圈的,也有使...

最大子串行和

最大子串行是要找出由數組成的一維陣列中和最大的連續子串行。比如的最大子串行就是 它的和是8,達到最大 而 的最大子串行是,它的和是6。找最大子串行的方法很簡單,只要前i項的和還沒有小於0那麼子串行就一直向後擴充套件,否則丟棄之前的子串行開始新的子串行,同時我們要記下各個子串行的和,最後找到和最大的子...

和最大子串行

時間限制 1 sec 記憶體限制 512 mb 提交 3 解決 3 提交 狀態 討論版 對於乙個給定的長度為n的整數序列a,它的 子串行 的定義是 a中非空的一段連續的元素 整數 你要完成的任務是,在所有可能的子串行中,找到乙個子串行,該子串行中所有元素的和是最大的 跟其他所有子串行相比 程式要求你...