【算法刷题】Day27

文章目录

  • 1. 买卖股票的最佳时机含手续费
    • 题干:
    • 算法原理:
      • 1. 状态表示:
      • 2. 状态转移方程
      • 3. 初始化
      • 4. 填表顺序
      • 5. 返回值
    • 代码:
  • 2. 提莫攻击
    • 题干:
    • 算法原理:
    • 代码:

1. 买卖股票的最佳时机含手续费

【算法刷题】Day27_第1张图片
原题链接


题干:

一个整数数组 prices
prices[i]表示第 i 天的股票价格
整数 fee 代表了交易股票的手续费用
可以无限次地完成交易,但是你每笔交易都需要付手续费
卖出之前不能再继续购买股票
返回获得利润的最大值
【算法刷题】Day27_第2张图片


算法原理:

1. 状态表示:

dp[i] 表示:第 i 天结束的之后,所能获得的最大利润
【算法刷题】Day27_第3张图片

f[i] 表示:第 i 天结束之后,处于”买入“状态,此时的最大利润
g[i] 表示:第 i 天结束之后,处于”卖出“状态,此时的最大利润

2. 状态转移方程

【算法刷题】Day27_第4张图片

f[i] = max(f[i - 1], g[ i- 1] - p[i])
g[i] = max(g[i - 1], f[i - 1] + p[i] + fee)

3. 初始化

f[0] = -p[0]
g[0] = 0

4. 填表顺序

从左往右,两个表一起填

5. 返回值

在买入状态的时候,肯定不会是最大利润
这个时候可以直接返回,g[n - 1]

或者直接返回:
max(f[n - 1], g[n - 1])


代码:

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

【算法刷题】Day27_第5张图片

2. 提莫攻击

【算法刷题】Day27_第6张图片
原题链接


题干:

中毒状态正好持续 duration 秒
在时间区间 [t, t + duration - 1](含 t 和 t + duration - 1)处于中毒状态
在中毒影响结束 前 再次攻击,中毒状态计时器将会 重置

返回处于中毒状态的 总秒数
【算法刷题】Day27_第7张图片


算法原理:

由规律可以推断出
【算法刷题】Day27_第8张图片


代码:

class Solution {
    public int findPoisonedDuration(int[] timeSeries, int duration) {
        int ret = 0;
        for(int i = 1; i < timeSeries.length; i++) {
            int x = timeSeries[i] - timeSeries[i - 1];
            if(x >= duration) {
                ret += duration;
            }else {
                ret += x;
            }
        }
        return ret + duration;
    }
}

【算法刷题】Day27_第9张图片

你可能感兴趣的:(算法刷题,算法,java)