算法题解:连续子数组的最大和及其下标
題目
輸入一個(gè)整型數(shù)組,數(shù)組里有正數(shù)也有負(fù)數(shù)。數(shù)組中一個(gè)或連續(xù)的多個(gè)整數(shù)組成一個(gè)子數(shù)組。求所有子數(shù)組的和的最大值。要求時(shí)間復(fù)雜度為O(n)。
舉例
輸入:2, -3, 4, 5, -9
輸出:9
和最大的連續(xù)子數(shù)組是 {4, 5},結(jié)果就是9。
思路
我們先假設(shè)和最大連續(xù)子數(shù)組是從第一個(gè)數(shù)開(kāi)始的。初始化和為0。第一步是加上數(shù)字2,此時(shí)和為2。第二步加上數(shù)字-3,此時(shí)和為-1。那么問(wèn)題來(lái)了,我們到底要不要加上數(shù)字-3呢?分析過(guò)程如下:
由上述分析可知,加上-3,此時(shí)累加的子數(shù)組和是-1;不加-3,此時(shí)累加的子數(shù)組和是-3。-1大于-3,為了后續(xù)的累加和更大,所以選擇加上-3。
接下來(lái),第三步要不要加上數(shù)字4,我們依據(jù)上面的決策流程繼續(xù)分析。當(dāng)加上數(shù)字4,此時(shí)累加和為4-1=3;不加上數(shù)字4,意味著當(dāng)前連續(xù)子數(shù)組終結(jié)于數(shù)字4之前,此時(shí)的累加和初始化為0,加上數(shù)字4后和等于4。顯而易見(jiàn),4大于3,所以我們選擇拋棄前面的累加和,由數(shù)字4繼續(xù)開(kāi)始。
后續(xù)步驟省略,總結(jié)一番。當(dāng)我們遍歷數(shù)組時(shí),對(duì)于每個(gè)數(shù)字,要么與前面的子數(shù)組累加,要么作為新子數(shù)組的起點(diǎn),如果累加之后的子數(shù)組和小于(或等于)當(dāng)前數(shù)字,我們就選擇拋棄前面的累加和,將當(dāng)前數(shù)字作為新子數(shù)組的起點(diǎn)。整個(gè)過(guò)程可以用表格總結(jié)如下:
| 1 | 加2 | 2 | 2 |
| 2 | 加-3 | -1 | 2 |
| 3 | 拋棄累加的和-1,加4 | 4 | 4 |
| 4 | 加5 | 9 | 9 |
| 5 | 加-9 | 0 | 9 |
代碼
根據(jù)題目要求,我們只需要求出連續(xù)子數(shù)組的最大和,如果面試官還要求找到連續(xù)子數(shù)組的起點(diǎn)與終點(diǎn)下標(biāo),那么最終的java代碼如下:
public class Main {public static int child_sum(int[] arr) {if (arr == null || arr.length < 1) {return 0;}int left0 = 0;int left1 = 0;int right = 0;int max = arr[0];int sum = 0;for (int i = 0; i < arr.length; i++) {sum += arr[i];if (sum <= arr[i]) { //使用<=還是<呢?sum = arr[i];left0 = i;}if (sum > max) {max = sum;left1 = left0;right = i;}}System.out.println("left:" + left1 + " right:" + right + " max:" + max);return max;}public static void main(String[] args) {int[] arr1 = new int[]{2, -3, 4, 5, -9};int[] arr2 = new int[]{2, -2, 4, 5, -9};int[] arr3 = new int[]{-2, -3, -4, -5, -9};child_sum(arr1);child_sum(arr2);child_sum(arr3);} }打印輸出:
left:2 right:3 max:9 left:2 right:3 max:9 left:0 right:0 max:-2在上面的代碼中使用小于等于或者使用小于有什么區(qū)別呢?
假設(shè)數(shù)組為{2, -2, 4, 5, -9},如果判斷條件是小于等于當(dāng)前數(shù)字,那么所得的最大連續(xù)子數(shù)組為{4, 5}。如果判斷條件是小于當(dāng)前數(shù)字,那么所得的最大連續(xù)子數(shù)組為{-2, 2, 4, 5}。如果對(duì)最大連續(xù)子數(shù)組的長(zhǎng)度沒(méi)有明確要求,使用小于等于進(jìn)行判斷即可。
轉(zhuǎn)載于:https://www.cnblogs.com/yueshutong/p/11469200.html
總結(jié)
以上是生活随笔為你收集整理的算法题解:连续子数组的最大和及其下标的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 人生建议
- 下一篇: maven编译的时候排除junit测试类