Day17-最大子数组和

YVTU

🔗 LeetCode 53 - Maximum Subarray

📌 题目描述

给你一个整数数组 nums,请你找出一个具有最大和的 连续子数组,并返回其最大和。


🔍 示例

1
2
3
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6。

💡 解题思路:动态规划(Kadane’s Algorithm)

  • dp[i] 表示以 nums[i] 结尾的最大子数组和
  • 转移公式:dp[i] = max(nums[i], dp[i-1] + nums[i])
  • 可优化为 O(1) 空间,仅用两个变量

✅ JavaScript 实现

1
2
3
4
5
6
7
8
9
var maxSubArray = function(nums) {
let maxSum = nums[0];
let currSum = nums[0];
for (let i = 1; i < nums.length; i++) {
currSum = Math.max(nums[i], currSum + nums[i]);
maxSum = Math.max(maxSum, currSum);
}
return maxSum;
};

✅ Swift 实现

1
2
3
4
5
6
7
8
9
func maxSubArray(_ nums: [Int]) -> Int {
var currSum = nums[0]
var maxSum = nums[0]
for i in 1..<nums.count {
currSum = max(nums[i], currSum + nums[i])
maxSum = max(maxSum, currSum)
}
return maxSum
}

🧠 思考拓展

  • 如何返回最大子数组的下标范围?
  • 如果数组是环形(头尾可以相连),如何求最大和?
  • 分治法如何实现?(O(nlogn))