給定一個整數數組(有正有負),找出總和最大連續數列

全局文檔編號:1452java

1、背景

一個朋友問了我這樣一個問題:給定一個整數數組(有正數有負數),例如{-2,1,-3,4,-1,2,1,-5,4},找出總和最大的連續數列,並返回總和。以爲挺有意思,寫代碼實現了一下。數組

2、思路故事

相似於逛街買衣服,咱們有明確的目標(例如:7分牛仔褲,類比於連續數列和最大),而後一家店一家店比價,比完價格最低的下單完事。code

  1. 遍歷數組,獲取其子數組,並計算和
  2. 不斷冒泡,子數組和更大的記錄其左右下標
  3. 遍歷結束,連續數列和最大結果揭曉

3、Java代碼實現

/**
* @author wangyao
* @date 2020-5-11 13:54
* @description:
*/
public class ArrayTest {
    public static void main(String[] args) {
        /**
         * 給定一個整數數組(有正數有負數),找出總和最大的連續數列,並返回總和。
         * 示例:
         * 輸入: [-2,1,-3,4,-1,2,1,-5,4]
         * 輸出: 6
         * 解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。
         */
        int left = 0, right = 0, maxCount = 0, preLeft, preRight, preMaxCount = 0;
        Integer[] a = {-2,1,-3,4,-1,2,1,-5,4};
        Integer[] targetArray = {};
        for (int i = 0; i < a.length; i++) {
            for (int j = i; j < a.length; j++ ) {
                preLeft = i;
                preRight = j;
                Integer[] childArray = Arrays.copyOfRange(a, i , j);
                preMaxCount = Arrays.asList(childArray).stream().mapToInt(value -> value).sum();
                if (preMaxCount > maxCount) {
                    left = preLeft;
                    right = preRight;
                    maxCount = preMaxCount;
                    targetArray = childArray;
                }
            }
        }
        System.out.println(left + "," + (right-1));
        System.out.print("符合條件的連續子數組爲:");
        Arrays.asList(targetArray).stream().forEach(integer -> System.out.print(integer.intValue() + ","));
        System.out.print("最大值" + maxCount);
    }
}
相關文章
相關標籤/搜索