vlambda博客
学习文章列表

【动态规划】剑指 Offer 42. 连续子数组的最大和(简单)

让我们先来看看这道题目的描述

关于这道题目,因为连续两字出现,我们不由得想到了前缀和,先不考虑题目要求的时间复杂度的限制

方法一:前缀和

class Solution { public int maxSubArray(int[] nums) { int n = nums.length; int[] dp = new int[n + 1]; for(int i = 1; i <= n; ++i){ dp[i] = dp[i - 1] + nums[i - 1]; } int max = nums[0]; for(int i = 0; i < n; ++i){ for(int j = i + 1; j <= n; ++j){ max = Math.max(max, dp[j] - dp[i]); } } return max;
}}

提交发现会TLE,让我们再来给出一个时间复杂度为O(n)的答案

方法二:动态规划

这道题目属于动态规划中比较简单的题目

我们用dp[i]来表示以第i个数结尾的子串的最大和,所以代码就很显然了

class Solution { public int maxSubArray(int[] nums) { int n = nums.length; int[] dp = new int[n]; dp[0] = nums[0]; int max = dp[0]; for(int i = 1; i < n; ++i){ dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]); max = Math.max(max, dp[i]); } return max;
}}

这道题目属于动态规划中简单的范畴,比如子串子序列这种类型的动态规划,一定要轻松拿下~

2022秋招马上就要开始了,你刷了多少题呢?