简单题
题目
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1] 输出:1
示例 3:
输入:nums = [5,4,-1,7,8] 输出:23
提示:
1 <= nums.length <=
1
0
5
10^{5}
105
1
0
−
4
10^{-4}
10−4 <= nums[i] <=
1
0
4
10^{4}
104
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray
分析
- 题目要求为整数数组,即最大子列和有可能为负数(如:{-2,-1}),与浙大数据结构的题目不同,不能采用“在线求解法”
- 考虑动态规划法,创建PreSum和MaxSum:
当PreSum>0时,加到当前元素上;
当PreSum<=0时,舍弃之前部分。
C
int maxSubArray(int* nums, int numsSize){
int PreSum, MaxSum, i;
PreSum = 0;
MaxSum = nums[0];
for (i = 0; i < numsSize; i++){
PreSum = fmax(PreSum + nums[i], nums[i]);
MaxSum = fmax(PreSum, MaxSum);
}
return MaxSum;
}