經典的最大子串行和

2021-10-02 01:31:35 字數 1705 閱讀 8893

給定乙個整數陣列,找到乙個連續子陣列其元素之和最大並返回

input:nums

output:最大連續子陣列之和

三種解法,分別是動態規劃、貪心法、分治法,其中分治演算法不是最優的。

定義d p[

i]

dp[i]

dp[i

]:以位置i

ii為結尾的子陣列最大和

d p[

i+1]

=dp[i] + nums[i], dp[i]>0 \\ nums[i], 其他 \end

dp[i+1

]=int maxsum = nums[0]

;for

(int i =

1;i)return maxsum;

}cursum用於記錄當前和(每一步都選擇最優的方案)

僅僅需要遍歷陣列一次,時間複雜度為o(n),空間複雜度為o(1)。

/**

* 貪心

* @param nums

* @return

*/public

intmaxsubarraygreed

(int

nums)

int cursum = nums[0]

, maxsum = cursum;

for(

int i =

1;i)return maxsum;

}

首先將陣列劃分成左和右兩部分,具有最大和的連續子陣列的位置可能有如下三種情況:

位於左邊的陣列部分;

位於右邊的陣列部分;

位於左和右交叉的部分,即最大子陣列有一部分在左邊,一部分在右邊。

其中,第一種情況和第二種情況可以遞迴。第三種情況由函式crosssum暴力計算,需要遍歷陣列一次,使得時間複雜度需要乘o(n)

/**

* 暴力計算包含位置p在內的最大子陣列和

* @param nums

* @param left

* @param right

* @param p

* @return

*/private

intcrosssum

(int

nums,

int left,

int right,

int p)

cursum =0;

for(

int i = p+

1;i<=right;i++

)return leftsubsum + rightsubsum;

}private

inthelper

(int

nums,

int left,

int right)

/** * 分治

* @param nums

* @return

*/public

intmaxsubarraydivide

(int

nums)

return

helper

(nums,

0, nums.length-1)

;}

時間複雜度為o(nlogn),helper函式多次遞迴,造成了空間複雜度為o(logn)

經典演算法 求最大子串行的和

最大連續子串行的和是一道很經典的演算法問題,給定乙個數列,其中可能有正數也可能有負數,我們的任務是找出其中連續的乙個子數列 不允許空序列 使它們的和盡可能大。例 輸入序列 2,3,1,4 輸出 9 注意 可以假設 輸入的陣列不為空,同時輸入的值都是整數。解法一 暴力破解 可以窮舉出所有的子串行,然後...

和最大子串行

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

最大子串行和

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