每日一题——最大子序和

菜鸡每日一题系列打卡53

每天一道算法题目 

小伙伴们一起留言打卡

坚持就是胜利,我们一起努力!

题目描述(引自LeetCode)

给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

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

进阶:

如果你已经实现复杂度为O(n)的解法,尝试使用更为精妙的分治法求解。

题目分析

直觉告诉我,这是一道非常典型的动态规划的题目。事实上,确实如此。

至于题目要求的进阶版解法,其更适合在维护一个整型数组的场景下使用,说白了,题目所提到的分治法,其实就是建立起一个类似于线段树的结构,然后之后的操作可以以空间换时间。但基于本题的实际情况,需要考虑建立数据结构的过程所带来的开销。

因此,本文采用动态规划的解法进行解答。对线段树这种结构比较好奇的小伙伴可以自行查阅资料进行学习,线段树不是一种新的数据结构,它是二叉搜索树的一种,之前已经讲过二叉搜索树的相关内容,在此就不展开。话不多说,上代码。

代码实现

// 动态规划解法
class Solution {


    public int maxSubArray(int[] nums) {
        // 特殊情况处理
        if (nums == null || nums.length == 0) return 0;
        int result = nums[0], tmp = 0;
        // 动态规划
        for (int i = 0; i < nums.length; i++) {
            tmp = tmp > 0 ? tmp + nums[i] : nums[i];
            result = tmp > result ? tmp : result;
        }
        // 返回结果
        return result;
    }


}


代码分析

对代码进行分析,程序对数组进行了一次遍历,因此,时间复杂度为O(n),而就空间而言,仅仅使用了常数级别的额外空间,因此,空间复杂度为O(1)。

执行结果

每日一题——最大子序和_第1张图片

学习 | 工作 | 分享

????长按关注“有理想的菜鸡

只有你想不到,没有你学不到

你可能感兴趣的:(算法)