class Solution {
public int maxSales(int[] sales) {
// dp[n]的含义,以sales[n]结尾的连输子数组最大和(难点在于这个定义,之前自己定义的数组长度为n的最大和)
// dp[n]= dp[n-1]<0,那么dp[n]=sales[n]
// dp[n-1]>0,那么dp[n]=dp[n-1]+sales[n]
// 最后我们只需要在所有dp里面取出最大值即可
int[] dp = new int[sales.length];
dp[0] = sales[0];
int max = sales[0];
for (int i = 1; i < sales.length; i++) {
dp[i] = dp[i - 1] > 0 ? dp[i - 1] + sales[i] : sales[i];
max=Math.max(max,dp[i]);
}
return max;
}
}
【题解2】把一维数组优化成一个变量
class Solution {
public int maxSales(int[] sales) {
// dp[n]的含义,以sales[n]结尾的连输子数组最大和(难点在于这个定义,之前自己定义的数组长度为n的最大和)
// dp[n]= dp[n-1]<0,那么dp[n]=sales[n]
// dp[n-1]>0,那么dp[n]=dp[n-1]+sales[n]
// 最后我们只需要在所有dp里面取出最大值即可
int pre = sales[0];
int max = sales[0];
for (int i = 1; i < sales.length; i++) {
pre = pre > 0 ? pre + sales[i] : sales[i];
max = Math.max(max, pre);
}
return max;
}
}
class Solution {
public int maxSales(int[] sales) {
int[] dp = new int[sales.length];
dp[0] = sales[0];
int max = Integer.MIN_VALUE;
max = Math.max(dp[0], max);
for(int i = 1; i < sales.length; i ++){
if(dp[i-1]<0){
dp[i] = sales[i];
}else{
dp[i] = dp[i-1]+sales[i];
}
max = Math.max(dp[i], max);
}
return max;
}
}
class Solution {
public int maxSales(int[] sales) {
int[] dp = new int[sales.length];
int res = sales[0];
dp[0] = sales[0];
for(int i = 1; i < sales.length; i++){
dp[i] = Math.max(sales[i], dp[i-1] + sales[i]);
res = Math.max(res, dp[i]);
}
return res;
}
}
时间:O(n)
空间:O(n)
class Solution {
public int maxSales(int[] sales) {
int[] dp=new int[sales.length];
dp[0]=sales[0];
int max=dp[0];
for(int i=1;imax) max=dp[i];
}
return max;
}
}
On ON
优化后
class Solution {
public int maxSales(int[] sales) {
int res=0;
res=sales[0];
int max=res;
for(int i=1;imax) max=res;
}
return max;
}
}
//动态规划
class Solution {
public int maxSales(int[] sales) {
int n = sales.length;
int [] dp = new int [n];
dp[0] = sales[0];
int max = dp[0];
for (int i = 1; i < n; i++) {
dp[i] = Math.max(sales[i], sales[i] + dp[i – 1]);
max = Math.max(max, dp[i]);
}
return max;
}
}
共以下 7 个回答
解题思路
– dp[n]的含义,以sales[n]结尾的连输子数组最大和(难点在于这个定义,之前自己定义的数组长度为n的最大和)
– dp[n]= dp[n-1]<0,那么dp[n]=sales[n];dp[n-1]>0,那么dp[n]=dp[n-1]+sales[n]
– 最后我们只需要在所有dp里面取出最大值即可
【题解1】使用一维数组dp进行解答
【题解2】把一维数组优化成一个变量
思路: 第i天利润取决于i-1是否亏损
class Solution {
public int maxSales(int[] sales) {
int[] dp = new int[sales.length];
int res = sales[0];
dp[0] = sales[0];
for(int i = 1; i < sales.length; i++){
dp[i] = Math.max(sales[i], dp[i-1] + sales[i]);
res = Math.max(res, dp[i]);
}
return res;
}
}
时间:O(n)
空间:O(n)
优化前:
On O1
时间复杂度O(N),空间复杂度O(1)。
//动态规划
class Solution {
public int maxSales(int[] sales) {
int n = sales.length;
int [] dp = new int [n];
dp[0] = sales[0];
int max = dp[0];
for (int i = 1; i < n; i++) {
dp[i] = Math.max(sales[i], sales[i] + dp[i – 1]);
max = Math.max(max, dp[i]);
}
return max;
}
}