Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。
难度:简单
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray
二、思路分析:
自我感觉这道题不应该归属到简单,思考了很久,想到的是双重for循环的思路去解决,定义一个max,跟循环中的值比较,取最大的结果,显然不符合复杂度为 O(n)的要求。参考网上题解,发现此题改用动态规划的思路实现。
题解中给出的动态规划转移方程:f(i)=max{f(i−1)+nums[i],nums[i]},结合例子,算是理解了这种方法。
在每一个扫描点计算以该点数值为结束点的子数列的最大和(正数和)
该子数列由两部分组成:以前一个位置为结束点的最大子数列、该位置的数值,以每个位置为终点的最大子数列都是基于其前一位置的最大子数列计算得出
三、AC 代码:
class Solution {
public int maxSubArray(int[] nums) {
int pre = 0, maxAns = nums[0];
for (int x : nums) {
pre = Math.max(pre + x, x);
maxAns = Math.max(maxAns, pre);
}
return maxAns;
}
}
四、总结:
我在网上看不少解答时,直接阅读其代码,总算理解了动态规划的方式,代码并不是自己完成的,算是学习思路吧, 分治法 求解的方法暂时就不做尝试了。
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐