当前位置: 面试刷题>> 最大子数组和(经典算法150题)


### 题目描述 **最大子数组和问题**:给定一个整数数组 `nums`,找到一个具有最大和的连续子数组(子数组至少包含一个元素),返回其最大和。 **示例 1**: ``` 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 ``` **示例 2**: ``` 输入: nums = [1] 输出: 1 ``` **示例 3**: ``` 输入: nums = [0] 输出: 0 ``` **示例 4**: ``` 输入: nums = [-1] 输出: -1 ``` **提示**: - `1 <= nums.length <= 3 * 10^4` - `-10^5 <= nums[i] <= 10^5` ### 解题思路 这个问题可以通过“Kadane's 算法”来解决,该算法的时间复杂度为 O(n),其中 n 是数组的长度。算法的基本思想是遍历数组,维护一个当前最大子数组和 `currentMax` 和一个全局最大子数组和 `globalMax`。在遍历过程中,如果 `currentMax` 加上当前元素 `nums[i]` 的结果比 `nums[i]` 本身还小(即 `currentMax + nums[i] < nums[i]`),则将 `currentMax` 更新为 `nums[i]`,否则累加 `nums[i]` 到 `currentMax`。同时,在每一步更新 `currentMax` 后,都要检查 `currentMax` 是否大于 `globalMax`,并相应地更新 `globalMax`。 ### 示例代码 #### PHP ```php function maxSubArray($nums) { $globalMax = $nums[0]; $currentMax = $nums[0]; for ($i = 1; $i < count($nums); $i++) { $currentMax = max($nums[$i], $currentMax + $nums[$i]); $globalMax = max($globalMax, $currentMax); } return $globalMax; } // 示例测试 $nums = [-2,1,-3,4,-1,2,1,-5,4]; echo maxSubArray($nums); // 输出 6 ``` #### Python ```python def maxSubArray(nums): globalMax = currentMax = nums[0] for num in nums[1:]: currentMax = max(num, currentMax + num) globalMax = max(globalMax, currentMax) return globalMax # 示例测试 nums = [-2,1,-3,4,-1,2,1,-5,4] print(maxSubArray(nums)) # 输出 6 ``` #### JavaScript ```javascript function maxSubArray(nums) { let globalMax = nums[0]; let currentMax = nums[0]; for (let i = 1; i < nums.length; i++) { currentMax = Math.max(nums[i], currentMax + nums[i]); globalMax = Math.max(globalMax, currentMax); } return globalMax; } // 示例测试 const nums = [-2,1,-3,4,-1,2,1,-5,4]; console.log(maxSubArray(nums)); // 输出 6 ``` 以上代码示例分别用 PHP、Python 和 JavaScript 实现了求解最大子数组和的问题,符合题目要求,并且可以在码小课网站上作为教学示例发布。
推荐面试题