原题目链接:53. 最大子序和
题目描述:
给定一个整数数组 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
示例 5:
输入:nums = [-100000]
输出:-100000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
做题思路:
- 其实这道题可以这么想,我们以nums = [-2,3,-1,1,-3] 为例子,首先要对数组进行遍历,当前最大连续子序列和为 sum,结果为 ans
1.1 如果 sum <= 0,则说明 sum 对结果无增益效果,需要舍弃,则 sum 直接更新为当前遍历数字。也就是说假如全是负数,那就是找最大值即可,因为负数肯定越加越大。
1.2 如果 sum > 0,则说明 sum 对结果有增益效果,则 sum 保留并加上当前遍历数字,也就是说如果有正数,则肯定从正数开始计算和,不然前面有负值,和肯定变小了,所以从正数开始。
1.3 当和小于零时,这个区间就告一段落了,然后从下一个正数或者是最小的负数重新开始计算。
1.4 每次比较 sum 和 ans的大小,将最大值置为ans,遍历结束返回结果
废话不多说,直接上代码,为了让各位看官更能清晰理解,我的代码写得不精简,我的代码里加了大量的注释,相信各位看官可以理解,如果我有些没写清楚或者写错的,可以评论区或者私信我喔
public int maxSubArray(int[] nums) {
//连续的几个元素加起来的和
int sum = 0;
//假设数组只有一个元素,就取出第一个元素
int ans = nums[0];
//遍历数组
for(int num : nums){
if(sum > 0){ //如果sum大于0,说明要加上遍历的元素,因为sum是正数
sum += num;
}else{ //如果sum是小于0的,直接等于遍历到的元素就行了,反正sum已经是负数了
sum = num;
}
//Math类的max方法是返回两个数据中的最大的数据
//例如(1,2)返回2,(2,4)返回4
//用ans和sum进行比较,这样做的目的是
//即使下一位元素是负数,那我们已经把之前的最大值赋值给ans,所以不用怕
ans = Math.max(ans,sum);
}
//返回最大值
return ans;
}