目录
1,题目描述
2,思路
基本思路
细节
参考文章
1,题目描述
Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
Example:
Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2,思路
解决本题的关键在于理解正增益 的概念。
个人理解:针对本题,设结果为ans,当前累加和为sum = 10,考虑以下两种场景:
- 后两个元素依次为-8,9:sum=sum-8=2大于0,后面的元素可能弥补此次减损,果然sum=sum+9=11,比原先sum=10大,;
- 后两个元素依次为-11,12:sum=sum-11=-1小于0,不论后面的元素为何值,都只会带来减损效果,故需要舍弃当前的sum,并将其值进行更新;
基本思路
- 设ans存当前连续最大和,sum判断是否正增益;
- 遍历数组一次,当sum<=0时,舍去当前sum,并将其值更新为当前位置指针所指元素的值;当sum>0时,则加上当前位置元素的值;
- 比较ans与sum,取最大值更新ans;
细节
- sum初始为0,则刚开始判断时,便有sum=0,sum便被数组中第一个元素值代替;
- ans初始为数组第一个元素;
- 当指针移到一个元素时,sum其实指的是当前元素之前(不包括当前元素)的计算结果,因此,如果sum<0,则可用当前元素值替换sum;
- 使用ans = sum > ans ? sum : ans;来取最大值,速度快,占空间少;
参考文章
【@灵魂画师牧码】
3,代码【C】
int maxSubArray(int* nums, int numsSize){
int sum = 0; //判断整体是否为正增益
int ans = nums[0];
for(int curP = 0 ; curP < numsSize ; curP++){
if(sum <= 0) sum = nums[curP];
else sum += nums[curP];
ans = sum > ans ? sum : ans; //取最大值
}
return ans;
}
标签:curP,nums,int,sum,元素,ans,Subarray,Array,LeetCode From: https://blog.51cto.com/u_15849465/5801378