[java實現]找一個數組的最大和的連續子數組(時間復雜度 O(n))


收藏一下,請直接點擊原帖地址:http://blog.csdn.net/hpf911/article/details/9275583
這是《劍指Offer》中的一道題目,數組中的元素可能是正負,所以連續的子組求和,會變大也可能變小,解題時首先要求當前的和(初始值為0)和下一個元素求和后,如果是負的,那么重新置0和下下個繼續求和,首先要找到使和增加的正的元素。然后有了當前最大的和后,紀錄下來;繼續累加求和,若新增的元素使和變為負數,那么重新置0,按這個邏輯找出剩余元素的一個最大子組和,若超過前紀錄,覆蓋,直到子組遍歷結束。(動態規划解題方法就是首先想好整個事件發展的邏輯,比如Sn和Sn-1,Sn-2的關系,然后可以用遞歸思想,或者數學上的歸納法得到事件發展規律,但是動態規划不同於遞歸的高復雜度的開銷,它將有用的子結果紀錄到表中,以部分空間來節約時間)下面代碼為置頂鏈接的原帖作者的代碼。


public class FindMaxSumOfSubArray {

    /** * @param args */
    public static void main(String[] args) {
        FindMaxSumOfSubArray f = new FindMaxSumOfSubArray();
        int[] arr = { 1, -2, 3, 10, -4, 7, 2, -5 };
        System.out.println("MaxSum:" + f.findMaxSum(arr));
    }

    public Integer findMaxSum(int[] arr) {
        int curSum = 0;
        int maxSum = 0;
        int len = arr.length;

        if (arr == null || len == 0) {
            return null;
        }

        for (int i = 0; i < len; i++) {
            curSum += arr[i];
            if (curSum < 0) {
                curSum = 0;
            }
            if (curSum > maxSum) {
                maxSum = curSum;
            }
        }

        // all data are negative
        if (maxSum == 0) {
            for (int i = 0; i < len; i++) {
                if (i == 0) {
                    maxSum = arr[i];
                }
                if (arr[i] > maxSum) {
                    maxSum = arr[i];
                }
            }
        }
        return maxSum;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



猜您在找 輸入一個整形數組(可能有正數和負數),求數組中連續子數組(最少有一個元素)的最大和。要求時間復雜度為O(n)(解決) 輸入一個整型數組,數據元素有正數也有負數,求元素組合成連續子數組之和最大的子數組,要求時間復雜度為O(n)。 Leetcode練習(Python):數組類:第53題:給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。進階: 如果你已經實現復雜度為 O(n) 的解法,嘗試使用更為精妙的分治法求解。 輸入一個整形數組,數組里有正數也有負數。 數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。 求所有子數組的和的最大值。要求時間復雜度為O(n) Leetcode練習(Python):數組類:第128題:給定一個未排序的整數數組,找出最長連續序列的長度。 要求算法的時間復雜度為 O(n)。 給定一個長度為N的數組,找出出現次數大於n/2,n/3的數,要求時間復雜度O(n),空間復雜度O(1) 兩個有序數組合並成一個有序數組(要求時間復雜度為O(n)) 給定一個無序的整數類型數組,求最長的連續元素序列的長度。 例如: 給出的數組為[100, 4, 200, 1, 3, 2], 最長的連續元素序列為[1, 2, 3, 4]. 返回這個序列的長度:4 你需要給出時間復雜度在O(n)之內的算法 時間復雜度O(n) 無序數組排序(時間復雜度為O(n))
 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM