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 解題思路
- 方法一:判斷每一項是否大於0,進行累加
一種很自然想到的遍歷方法,設置一個變量max 保存現有的累加最大值,當前一項大於0的時候,就進行相加即可 - 方法二:動態規劃
來自大佬的題解是下面的鏈接
面試題42. 連續子數組的最大和(動態規劃,清晰圖解)
空間複雜度降低:
由於 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