【LeetCode力扣题库】53. 最大子序和(简单)

原题目链接: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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

做题思路:

  1. 其实这道题可以这么想,我们以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;
    }

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值