☆打卡算法☆LeetCode 53、最大子序和 算法解析

举报
恬静的小魔龙 发表于 2022/01/27 15:03:20 2022/01/27
【摘要】 推荐阅读CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群:1040082875大家好,我是小魔龙,Unity3D软件工程师,VR、AR,虚拟仿真方向,不定时更新软件开发技巧,生活感悟,觉得有用记得一键三连哦。 一、题目 1、算法题目“给定一个整数数组,找到最大和的连续子数组,返回其最大和。”题目链接:来源:力扣(LeetCode)链接:53. 最大子序和 - ...

推荐阅读

大家好,我是小魔龙,Unity3D软件工程师,VR、AR,虚拟仿真方向,不定时更新软件开发技巧,生活感悟,觉得有用记得一键三连哦。

一、题目

1、算法题目

“给定一个整数数组,找到最大和的连续子数组,返回其最大和。”

题目链接:

来源:力扣(LeetCode)

链接:53. 最大子序和 - 力扣(LeetCode) (leetcode-cn.com)

2、题目描述

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

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

二、解题

1、思路分析

这个题解法很多,可以使用暴力法、动态规划、贪心法、分治法。

这里就用动态规划法来解这道题。

假设数组的长度是n,下标是0到n-1,f(i)代表连续子数组的最大和,那么只需要求出每个位置的f(i),不就找到最大和了吗?

那么怎么求每个位置的f(i)呢?这取决于nums[i]和f[i-1]+nums[i]谁更大,所以就可以推到出动态规划转移方程:

f(i)=max{f(i-1)+nums[i],nums[i]}

2、代码实现

代码参考:

public class Solution {
    public int MaxSubArray(int[] nums) {
        int pre = 0, maxAns = nums[0];
        foreach (int x in nums) {
            pre = Math.Max(pre + x, x);
            maxAns = Math.Max(maxAns, pre);
        }
        return maxAns;
    }
}

image.png

3、时间复杂度

时间复杂度 : O(n)

其中n是数组的长度,只需要遍历一遍数组即可求得答案。

空间复杂度: O(1)

只需要常数级别的空间存放变量。

三、总结

我觉得这道题目的思想是:

走完这一生

如果我和你在一起会变得更好,那我们就在一起,否则我就丢下你。

我回顾我最光辉的时刻

就是和不同人在一起,变得更好的最长连续时刻

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。