二哥的LeetCode刷题笔记,第 53 题最大子数组和,动态规划轻松解决
鲁迅曾说,日子总要一天天的过,就过成了一生。每天都要有所收获,每天都要有所进步,这样子,我们的生活才会更加充实,更加有意义。今天,我们就来学习一道算法题——最大子数组合,希望你能够有所收获。
题意
给你一个整数数组 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
遇到这种题目,暴力算法是最容易想到的,直接穷举所有可能的子数组,计算每个子数组的和,找到最大值。
class Solution {
public int maxSubArray(int[] nums) {
int n = nums.length;
int maxSum = Integer.MIN_VALUE; // 初始化为最小值
// 枚举每一个子数组
for (int i = 0; i < n; i++) {
int currentSum = 0; // 当前子数组的和
for (int j = i; j < n; j++) {
currentSum += nums[j]; // 累加当前子数组的元素
maxSum = Math.max(maxSum, currentSum); // 更新最大和
}
}
return maxSum; // 返回最大子数组的和
}
public static void main(String[] args) {
Solution solution = new Solution();
int[] nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
System.out.println(solution.maxSubArray(nums)); // 输出: 6
}
}
算法非常简单,两层 for 循环,第一层从 i 到 n,第二层就是从 i+1 到 n,这样子就能够枚举出所有的子数组,然后计算每个子数组的和,找到最大值。
只不过效率会比较低,会超出时间限制。
分析 2
暴力算法的问题在于,我们重复计算了很多子数组的和,比如说,我们在计算 真诚点赞 诚不我欺[0,1,2]
和的时候,已经计算了 [0,1]
热门评论
2 条评论
回复