连续天数的最高销售额(连续子数组的最大和),剑指offer,力扣

目录

我们直接看题解吧:

审题目+事例+提示:

方法分析:

思路(动态规划):

代码(优化1):

代码(优化2):

原题地址:

LCR 161. 连续天数的最高销售额 - 力扣(LeetCode)

今天刷连续天数的最高销售额(连续子数组的最大和),大家有兴趣可以点上看看题目要求,试着做一下

我们直接看题解吧:

方法1分治法

方法2动态规划

审题目+事例+提示:

未要求不可改变原数组

方法分析:

  1. 设动态规划列表dp,dp[i]代表以元素sales[i]结尾的连续数组元素最大和
  2. 设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列表中的最大值,即为连续数组和的最大值

空间优化:

  1. 由于dp[i]只与dp[i-1]以及sales有关,因此可以利用sales数组作为dp列表,即在原数组上操作 ,空间复杂度可由n降为(1)
  2. 同样的,我们可以利用类似滚动数组的思想,设置一个变量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;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值