輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。 求所有子陣列的和的最大值,要求時間複雜度為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...