【LeetCode】Day55-最佳观光组合&买卖股票的最佳时机 II

本文介绍了两个编程问题:如何通过动态规划求解最佳观光组合问题,以及使用贪心算法计算多次买卖股票的最大利润。讲解了两种方法的时间复杂度和空间复杂度,并提供了相应的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目1

1014. 最佳观光组合【中等】

题解

v a l u e s [ i ] + i + v a l u e s [ j ] − j values[i]+i+values[j]-j values[i]+i+values[j]j拆分为values[i]+ivalues[j]-j,分别求values[i]+i最大值和整体最大值,只需一次遍历

class Solution {
    public int maxScoreSightseeingPair(int[] values) {
        int res=0;
        int maxi=values[0];
        for(int j=1;j<values.length;j++){
            res=Math.max(res,maxi+values[j]-j);//values[i]+i+values[j]-j最大值
            maxi=Math.max(maxi,values[j]+j);//values[i]+i最大值
        }
        return res;
    }
}

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( 1 ) O(1) O(1)

题目2

122. 买卖股票的最佳时机 II【中等】

题解

121. 买卖股票的最佳时机【简单】的进阶题,原来只能买一次股票,现在可以买多次股票了,计算所有利润总和的最大值

动态规划

  1. 状态定义dp[i][0] 表示第 i 天交易完后手里没有股票的最大利润,dp[i][1] 表示第 i 天交易完后手里持有一支股票的最大利润
  2. 状态转移方程
    在这里插入图片描述
  3. 返回值:dp[n-1][0],即最后一天已经卖完全部股票的最大利润
class Solution {
    public int maxProfit(int[] prices) {
        int n=prices.length;
        int dp[][]=new int[n][2];
        dp[0][0]=0;
        dp[0][1]=-prices[0];
        
        for(int i=1;i<n;i++){
            dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);//第i天无股票最大利润
            dp[i][1]=Math.max(dp[i-1][0]-prices[i],dp[i-1][1]);//第i天有股票最大利润
        }
        return dp[n-1][0];
    }
}

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n),亦可以用滚动数组优化空间为O(1)

贪心算法

贪心算法只能用于计算最大利润,计算的过程并不是实际的交易过程。
在这里插入图片描述

class Solution {
    public int maxProfit(int[] prices) {
        int n=prices.length,res=0;
        for(int i=1;i<n;i++){
            res+=Math.max(0,prices[i]-prices[i-1]);
        }
        return res;
    }
}

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( 1 ) O(1) O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值