大家好!我是曾续缘🤪
今天是《LeetCode 热题 100》系列
发车第 13 天
普通数组第 1 题
❤️点赞 👍 收藏 ⭐再看,养成习惯
给你一个整数数组
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)
的解法,尝试使用更为精妙的 分治法 求解。
解题方法
定义 f[i]
为前 i
个元素中选择nums[i]
能形成子数组的最大和。 从头开始遍历,假设遍历到i
,选择的nums[i]
要么和之前选的数连成子数组, 要么是新的子数组的开始元素.
在之前选的数中, 我们已知了
f[i-1]
为最佳答案, 肯定选择f[i-1]+nums[i]
作为新的最佳答案.如果选择作为新的子数组, 和就为
nums[i]
.
f[i]
在选择两者中的最大和.
Code
查看代码
java
class Solution {
public int maxSubArray(int[] nums) {
int n = nums.length, ans = (int)-1e6;
int[] f = new int[n + 1];
Arrays.fill(f, (int)-1e6);
for(int i = 0; i < n; i++){
f[i + 1] = Math.max(f[i] + nums[i], nums[i]);
ans = Math.max(ans, f[i + 1]);
}
return ans;
}
}