[Java]劍指offer:子數組的最大累加和問題


題目描述

給定一個數組arr,返回子數組的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子數組中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
題目保證沒有全為負數的數據
[要求]
時間復雜度為 O(n)O(n),空間復雜度為O(1)O(1)
 

輸入

[1, -2, 3, 5, -2, 6, -1]

返回值

12

 

思路

如果arr中沒有正數,那么產生的最大累加和一定是數組中的最大值

如果arr中有正數,從左到右遍歷arr,用變量cur記錄每一步的累加和。

當cur<0的時候,說明累加的這一部分肯定不能作為產生最大累加和子數組的左邊部分。所以此時讓cur=0,表示cur從下一個數開始重新累加。當cur>0的時候,每次累加都可能是最大累加和,所以用另一個變量max全程跟蹤記錄cur出現的最大值即可。

 

import java.util.*;


public class Solution {
    /**
     * max sum of the subarray
     * @param arr int整型一維數組 the array
     * @return int整型
     */
    public int maxsumofSubarray (int[] arr) {
        if(arr.length==0||arr==null){
            return 0;
        }
        int max = Integer.MIN_VALUE;
        int cur = 0;
        for(int i = 0; i!=arr.length;i++){
            cur += arr[i];
            max = Math.max(max,cur);
            cur = cur<0?0:cur;
        }
        return max;
    }
}

  


免責聲明!

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



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM