程式設計之法 面試和演算法心得(最大連續子陣列和)

2022-08-29 19:33:15 字數 1634 閱讀 3650

輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。 求所有子陣列的和的最大值,要求時間複雜度為o(n)。

例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為3, 10, -4, 7, 2, 因此輸出為該子陣列的和18。

求乙個陣列的最大子陣列和,我想最直觀最野蠻的辦法便是,三個for迴圈三層遍歷,求出陣列中每乙個子陣列的和,最終求出這些子陣列的最大的乙個值。 令currsum[i, …, j]為陣列a中第i個元素到第j個元素的和(其中0 <= i <= j < n),maxsum為最終求到的最大連續子陣列的和。

且當全是負數的情況時,我們可以讓程式返回0,也可以讓程式返回最大的那個負數,這裡,我們讓程式返回最大的那個負數。

/*

* 求乙個陣列的最大子陣列和,我想最直觀最野蠻的辦法便是,三個for迴圈三層遍歷,

* 求出陣列中每乙個子陣列的和,最終求出這些子陣列的最大的乙個值。

* 令currsum[i, …, j]為陣列a中第i個元素到第j個元素的和(其中0 <= i <= j < n),

* maxsum為最終求到的最大連續子陣列的和。

* 且當全是負數的情況時,我們可以讓程式返回0,也可以讓程式返回最大的那個負數,這裡,我們讓程式返回最大的那個負數。

*/public

static

int solution1(int

arr)

maxsum =math.max(maxsum, currsum);}}

return

maxsum;

}

此方法的時間複雜度為o(n^3)。

事實上,當我們令currsum為當前最大子陣列的和,maxsum為最後要返回的最大子陣列的和,當我們往後掃瞄時,

同時,當currsum > maxsum,則更新maxsum = currsum,否則保持原值,不更新。

currsum = max(a[j], currsum + a[j])

maxsum = max(maxsum, currsum)

舉個例子,當輸入陣列是1, -2, 3, 10, -4, 7, 2, -5,那麼,currsum和maxsum相應的變化為:

/*

* 解法二

* 事實上,當我們令currsum為當前最大子陣列的和,maxsum為最後要返回的最大子陣列的和,當我們往後掃瞄時,

* 對第j+1個元素有兩種選擇:要麼放入前面找到的子陣列,要麼做為新子陣列的第乙個元素;

* 如果currsum加上當前元素a[j]後不小於a[j],則令currsum加上a[j],否則currsum重新賦值,置為下乙個元素,即currsum = a[j]。

* 同時,當currsum > maxsum,則更新maxsum = currsum,否則保持原值,不更新。

* 即* currsum = max(a[j], currsum + a[j])

* maxsum = max(maxsum, currsum)

*/public

static

int solution2(int

arr)

return

maxsum;

}

程式設計之法 面試和演算法心得(最大連續乘積子串)

給乙個浮點數序列,取最大乘積連續子串的值,例如 2.5,4,0,3,0.5,8,1,則取出的最大乘積連續子串為3,0.5,8。也就是說,上述陣列中,3 0.5 8這3個數的乘積30.58 12是最大的,而且是連續的。此最大乘積連續子串與最大乘積子串行不同,請勿混淆,前者子串要求連續,後者子串行不要求...

《程式設計之法》 最大連續子陣列和

給定乙個整數陣列,陣列裡可能有正數 負數和零。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。例如,如果輸入的陣列為,那麼和為最大的連續子陣列為,和為18。使用動態規劃的思想。令currsum是以當前元素結尾的最大連續子陣列的和,maxsum是全域性的最大子...

程式設計之法 面試和演算法心得 筆記

一 字串翻轉 三步反轉法,先將兩部分分別反轉,然後再整體反轉。abcdef defabc 1 cbadef 旋轉前一部分 2 cbafed 旋轉後一部分 3 defabc 整個旋轉 那麼將 i am a student.studnet.a am i 也類似。二 字串的包含 a abcxyzlmnop...