日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

算法题解:连续子数组的最大和及其下标

發(fā)布時(shí)間:2023/12/2 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法题解:连续子数组的最大和及其下标 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目

輸入一個(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í)的和為-1,然后由-1繼續(xù)加下一個(gè)數(shù)。
  • 不加-3。也就是意味當(dāng)前連續(xù)子數(shù)組就終結(jié)于-3之前的數(shù)字,下一個(gè)連續(xù)子數(shù)組的和初始化為0,再加上第一個(gè)數(shù)字-3,和為-3。
  • 由上述分析可知,加上-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é)如下:

    步驟操作累加的子數(shù)組和最大的子數(shù)組和
    1加222
    2加-3-12
    3拋棄累加的和-1,加444
    4加599
    5加-909

    代碼

    根據(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。