[劍指 offer]--動態規劃-面試題42. 連續子數組的最大和

1 題目描述

輸入一個整型數組,數組裏有正數也有負數。數組中的一個或連續多個整數組成一個子數組。求所有子數組的和的最大值。

要求時間複雜度爲O(n)。

示例1:

輸入: nums = [-2,1,-3,4,-1,2,1,-5,4]
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。

提示:

1 <= arr.length <= 10^5
-100 <= arr[i] <= 100

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

2 解題思路

在這裏插入圖片描述

空間複雜度降低:

由於 dp[i] 只與 dp[i−1] 和nums[i] 有關係,因此可以將原數組nums 用作 dp 列表,即直接在 nums 上修改即可。
由於省去 dp 列表使用的額外空間,因此空間複雜度從 O(N) 降至 O(1) 。這裏還是寫了有dp的解法,因爲比較好想,適合本人的思維模式。
複雜度分析:

時間複雜度 O(N) : 線性遍歷數組nums 即可獲得結果,使用 O(N) 時間。
空間複雜度 O(1) : 使用常數大小的額外空間。

作者:jyd
鏈接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/solution/mian-shi-ti-42-lian-xu-zi-shu-zu-de-zui-da-he-do-2/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

3 解決代碼

  • 方法一:判斷每一項是否大於0,進行累加《Java代碼》
class Solution {
    public int maxSubArray(int[] nums) {
        //int[] dp = new int[nums.length];
        int max = nums[0];
        for(int i = 1 ; i < nums.length; i++){
            if(nums[i - 1] > 0){
                nums[i] += nums[i - 1];
            }
            max = Math.max(max, nums[i]);
        }
        return max;
    }
}
  • 方法二:動態規劃《Java代碼》
class Solution {
    public int maxSubArray(int[] nums) {
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        int max = nums[0];
        for(int i = 1; i < nums.length; i++){
            //如果加上nus[i]之後的和比nums[i]小,則只保留nums[i]
            //dp[i] = Math.max(nums[i], dp[i - 1] + nums[i]);
            nums[i] += Math.max(nums[i-1], 0);
            //max = Math.max(dp[i], max);
            max = Math.max(nums[i], max);
        }
        return max;

    }
}
  • 方法二:動態規劃《python3代碼》
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        dp =[0] * len(nums)
        dp[0] = nums[0]
        res = nums[0]
        for i in range(1, len(nums)):
            dp[i] = max(nums[i], dp[i - 1] + nums[i])
            res = max(dp[i], res)
        return res
        
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章