题目:
Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
A subarray is a contiguous part of an array.
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
Example 1:
Input: nums = [-2,1,-3,4,-1,2,1,-5,4]
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 最大的和为 6 。
Example 2:
Input: nums = [1]
Output: 1
示例 2:
输入:nums = [1]
输出:1
Example 3:
Input: nums = [5,4,-1,7,8]
Output: 23
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
Constraints:
- 1 <= nums.length <= 3 * 1 0 4 10^4 104
- - 1 0 5 10^5 105 <= nums[i] <= 1 0 5 10^5 105
提示:
- 1 <= nums.length <= 3 * 1 0 4 10^4 104
- - 1 0 5 10^5 105 <= nums[i] <= 1 0 5 10^5 105
Follow up:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
进阶:
如果您已经找到了O(n)解决方案,请尝试使用分治方法编写另一个解决方案,看看哪个更微妙。
解题思路:
方法一:贪心算法
贪心算法:做出当前最优解,即某种意义上的局部最优解。
就本题来说:求最大子序和来说当数组nums =[-2,1,-3,4,-1,2,1,-5,4]计算子序和的时候一定是从1开始(即前一个子序和丢弃),而当子序和小于0时则放弃当前子序和从下一个元素开始计算。
python代码
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
pre = -float('inf')
subMax = 0
for i in range(len(nums)):
subMax += nums[i]
if subMax > pre:
pre = subMax
if subMax <= 0:
subMax = 0
return pre
Java代码
class Solution {
public int maxSubArray(int[] nums) {
if (nums.length == 1){
return nums[0];
}
int pre = Integer.MIN_VALUE;
int subMax = 0;
for (int i = 0; i < nums.