面試算法-求數組最大子序列和

1. 題目

有一個數組,如-2, 3, 6, 2, -4, 15, -8,查找其中最大子序列和。在本例中,最大值爲3+6+2+-4+15=22,假設數組中必有正數.

2.思路

  1. 假設我們已知結果,和爲最大的最大子序列爲i到j之間
  2. 可以將i-1做爲分界點,即該點之前的子序列和爲負數,因爲若該子序列不爲負數則可於後續序列相加,與假設相悖
  3. 由思路1和2可進行操作:從數組由左至右相加,若爲負數則可理解爲到了分界點,不做計入,在分界點之後繼續開始計算

3.上代碼

package com.coline.algorithm.subarray;

/**
 * 算法:求數組最大子序列和
 *
 * @author Coline
 * 題目:有一個數組,如-2, 3, 6, 2, -4, 15, -8,查找其中最大子序列和。在本例中,最大值爲3+6+2+-4+15=22,假設數組中必有正數.
 * 思路:
 * 1.假設我們已知結果,和爲最大的最大子序列爲i到j之間
 * 2.可以將i-1做爲分界點,即該點之前的子序列和爲負數,因爲若該子序列不爲負數則可於後續序列相加,與假設相悖
 * 3.由思路1和2可進行操作:從數組由左至右相加,若爲負數則可理解爲到了分界點,不做計入,在分界點之後繼續開始計算
 */
public class MaxSumSubArray {
    static int maxSumSubArray(int[] array) {
        // 用於存放最大和
        int maxSum = 0;
        // 用於存放當前遍歷子序列和
        int currentSum = 0;

        for (int value : array) {
            currentSum += value;
            // 若當前子序列和小於0則以此爲分界點重新計算
            if (currentSum < 0) {
                currentSum = 0;
            } else {
                // 若當前子序列和大於記錄的最大值則將currentSum賦值給maxSum
                if (currentSum > maxSum) {
                    maxSum = currentSum;
                }
            }
        }

        return maxSum;
    }

    public static void main(String[] arg0) {
        int[] array = {-2, 3, 6, 2, -4, 15, -8};

        System.out.println(maxSumSubArray(array));

    }
}

發佈了56 篇原創文章 · 獲贊 18 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章