给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。【LeetCode Hot 100】

力扣热题100之第53题:

先贴代码:

class Solution {
    public int maxSubArray(int[] nums) {
        //定义一个cur,存储子数组的和
        int cur = 0;
        //定义maxsum,为连续子数组的最大和
        int maxsum = nums[0];
        //for循环遍历数组,cur为从0开始的子数组和,若遍历到x时,之前子数组的和小于x的值
        //则抛弃之前的子数组,cur从当前的x开始计算新的子数组的和
        //maxsum记录每一个子数组之间的最大值!
        for (int x : nums) {
            cur = Math.max(cur + x, x);
            maxsum = Math.max(maxsum, cur);
        }
        //返回maxsum
        return maxsum;
    }
}

解题思路:本题目中要求我们求出连续子数组的最大和,需要注意子数组必须为连续的,即下标连续递增。然而题目中并没有要求子数组具体是多大,可能是一个元素,也可能是三个元素,我们并不清楚,最简单最直观的方法就是列出当元素为1时所有子数组,当元素为2时所有的子数组,等等,最后求出这些子数组之间和的最大值。但是这样写的话过于麻烦,时间复杂度也很高,那么我们可不可以再优化下呢?

我们刚刚提到的方法是列出所有的子数组,再在这些子数组中求出最大的和。那么我们可以定义一个变量cur用来表示一个当前子数组的和。cur从0开始,依次往后加上元素的值,如果遍历到i时,子数组的和cur加上i下标的值的总和还要小于i下标的值,那么就令cur从i下标开始计算新的子数组的和,因为之前连续元素的和都已经小于新子数组第一个元素的值了。

由此就可以一次遍历解决问题。

猜你喜欢

转载自blog.csdn.net/weixin_56960711/article/details/123280785
今日推荐