LeetCode——剑指 Offer 42. 连续子数组的最大和(Java)

题目描述

题干:
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。

示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

题解思路

返回连续子数组和最大值,直接强制命令你时间复杂度为O(n)

明显你提示你最佳答案是一次循环就可以解决,当然也不排除有更佳的办法

这里我们采用一次循环的做法,每次添加新元素后比较和新元素作比较

如果没有当前新元素大,说明前面的和为负数,所以直接保存当前元素,否则就保存和

之后每次比较当前和和以前保存的和,取出最大值即可

正确代码

    public int maxSubArray(int[] nums) {
        int pre = 0, ans = nums[0];
        for (int num : nums) {
            pre = Math.max(num, pre + num);
            ans = Math.max(pre, ans);
        }
        return ans;
    }

总结

官方给出了一个分支线段树的方法,不过确实不是我现在能参悟的

在维护和修改的方面来说确实是高,希望自己了解了线段树之后可以灵活运用到类似题目上

如果文章存在问题或则和有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见
posted @ 2021-07-17 09:54  21岁还不是架构师  阅读(36)  评论(0编辑  收藏  举报