【LeetCode笔记】53. 最大子序和(Java、动态规划)

题目描述

  • 经典题目了,多种解法(不过目前只学了一种,暴力不算)
    在这里插入图片描述

代码 & 思路

这块基本上算是写给自己看的了。。写得不好,如果想学这种方法最好还是去leetcode题解看。

  • sum = num:因为在上一次循环结尾,就已经取得了i-1结尾的子序的最大和,也就是[0, i-1]的任务已经完成了,继续使用无意义,因为sum < 0的情况下,只会对后面的子序带来负增益
  • 例子1:1,2 ,-4,1, -1,首先取到最大值【1,2】,然后【1,2,-4】时,【1,2,-4】已经无意义,接下来只要对剩下的【1,-1】进行判断即可。
    原因:首先从2开始的【2,-4】肯定不如之前的【1,2,-4】大,因为之所以2之前的【1】能连上2,就是因为【1】这一部分是不小于0的,有正增益。然后之所以不能取【2,-4】再连上后面的【1,-1】,是因为这肯定还不如【1,2,-4】,原理基本上同上(前面的起码还是正增益,舍掉了得比现在还小)。
class Solution {
    public int maxSubArray(int[] nums) {
        int ans = nums[0];
        
        int sum = 0;
        // 使用动态规划:时间复杂度O(n)
        for(int num : nums){
            // 取值,然后舍掉(因为不如不加)
            if(sum < 0){
                sum = num;
            }
            // 否则继续下去
            else{
                sum += num;
            }
            ans = Math.max(ans,sum);
        }

        return ans;
    }
}
  • 时间复杂度O(n),一次遍历结束
  • 空间复杂度O(1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值