目录
原题地址:
今天刷连续天数的最高销售额(连续子数组的最大和),大家有兴趣可以点上看看题目要求,试着做一下。
我们直接看题解吧:
方法1分治法
方法2动态规划
审题目+事例+提示:
未要求不可改变原数组
方法分析:
- 设动态规划列表dp,dp[i]代表以元素sales[i]结尾的连续数组元素最大和
- 设dp[0]=sales[0],
3、若dp[i-1]<0,则dp[i-1]+sales[i]<sales[i]
若dp[i-1]>0,则dp[i-1]+sales[i]>sales[i]
4、返回dp列表中的最大值,即为连续数组和的最大值
空间优化:
- 由于dp[i]只与dp[i-1]以及sales有关,因此可以利用sales数组作为dp列表,即在原数组上操作 ,空间复杂度可由n降为(1)
- 同样的,我们可以利用类似滚动数组的思想,设置一个变量pre,维护当前的dp[i]与dp[i-1]的值。
思路(动态规划):
优化1:
循环从1开始遍历sales数组
·sales[i]中存sales[i-1]与0的最大值,即整数
·res中存res与sales[i]最大值
优化2:
循环从0开始遍历
·取x与pre最大值
·取pre与 maxans最大值
代码(优化1):
class Solution {
public int maxSales(int[] sales) {
int res = sales[0];
for(int i = 1; i < sales.length; i++) {
sales[i] += Math.max(sales[i - 1], 0);
res = Math.max(res, sales[i]);
}
return res;
}
}
代码(优化2):
class Solution {
public int maxSales(int[] sales) {
int pre = 0, maxAns = sales[0];
for (int x : sales) {
pre = Math.max(pre + x, x);
maxAns = Math.max(maxAns, pre);
}
return maxAns;
}
}