当前位置:网站首页>LeetCode每日一题(309. Best Time to Buy and Sell Stock with Cooldown)
LeetCode每日一题(309. Best Time to Buy and Sell Stock with Cooldown)
2022-08-01 05:30:00 【wangjun861205】
You are given an array prices where prices[i] is the price of a given stock on the ith day.
Find the maximum profit you can achieve. You may complete as many transactions as you like (i.e., buy one and sell one share of the stock multiple times) with the following restrictions:
After you sell your stock, you cannot buy stock on the next day (i.e., cooldown one day).
Note: You may not engage in multiple transactions simultaneously (i.e., you must sell the stock before you buy again).
Example 1:
Input: prices = [1,2,3,0,2]
Output: 3
Explanation: transactions = [buy, sell, cooldown, buy, sell]
Example 2:
Input: prices = [1]
Output: 0
Constraints:
- 1 <= prices.length <= 5000
- 0 <= prices[i] <= 1000
当 prices[i] >= prices[i-1]的时候, 我们有两个选择, 一个是卖掉当前的股票, 然后跳到 i+2(因为卖掉之后有 1 天的冷静期), 另一个是不卖, 然后正常走到 i+1. 我们同时维护当前的最高和最低价格, 类似于一个单调递增队列, 用于记录当前的最佳买入时机和最佳卖出时机
use std::collections::HashMap;
impl Solution {
fn dp(
prices: &Vec<i32>,
i: usize,
min: i32,
max: i32,
cache: &mut HashMap<(usize, i32, i32), i32>,
) -> i32 {
if i >= prices.len() {
return max - min;
}
let curr = prices[i];
if min == -1 && max == -1 {
let ans = if let Some(c) = cache.get(&(i + 1, curr, curr)) {
*c
} else {
Solution::dp(prices, i + 1, curr, curr, cache)
};
cache.insert((i, -1, -1), ans);
return ans;
}
if curr >= max {
let sell = if let Some(c) = cache.get(&(i + 2, -1, -1)) {
*c
} else {
Solution::dp(prices, i + 2, -1, -1, cache)
} + curr
- min;
let keep = if let Some(c) = cache.get(&(i + 1, min, max)) {
*c
} else {
Solution::dp(prices, i + 1, min, max, cache)
};
let ans = sell.max(keep);
cache.insert((i, min, max), ans);
return ans;
}
if curr <= min {
let ans = if let Some(c) = cache.get(&(i + 1, curr, curr)) {
*c
} else {
Solution::dp(prices, i + 1, curr, curr, cache)
};
cache.insert((i, min, max), ans);
return ans;
} else {
let ans = if let Some(c) = cache.get(&(i + 1, min, curr)) {
*c
} else {
Solution::dp(prices, i + 1, min, curr, cache)
};
cache.insert((i, min, max), ans);
return ans;
}
}
pub fn max_profit(prices: Vec<i32>) -> i32 {
Solution::dp(&prices, 0, -1, -1, &mut HashMap::new())
}
}
边栏推荐
- LeetCode 1189. “气球” 的最大数量
- 解决浏览器滚动条导致的页面闪烁问题
- Selenium: browser operation
- NDK does not contain any platforms问题解决
- NDK does not contain any platforms problem solving
- LeetCode 387. 字符串中的第一个唯一字符
- pytroch、tensorflow对比学习—搭建模型范式(低阶、中阶、高阶API示例)
- ApiFile
- II. Binary tree to Offer 68 - recent common ancestor
- Selenium:浏览器操作
猜你喜欢
NDK does not contain any platforms问题解决
七、MFC序列化机制和序列化类对象
Induction jian hai JustFE 2022/07/29 team, I learned the efficient development summary (years)
MySQL-Data Definition Language-DDLdatebase define language
What should I do if the neural network cannot be trained?
对话MySQL之父:一个优秀程序员可抵5个普通程序员
leetcode125 Verify palindrome string
Robot_Framework: Assertion
关于给Qt做一个软件初始化的进度条
The solution to the inconsistency between the PaddleX deployment inference model and the GUI interface test results
随机推荐
Selenium: JS operation
Solve the problem of page flicker caused by browser scroll bars
Dialogue with the father of MySQL: One excellent programmer is worth 5 ordinary programmers
uva10825
leetcode43 字符串相乘
冲刺金九银十,Android开发面试(内含面试资料|面试题|源码)
Robot_Framework:断言
Error: AttributeError: module 'matplotlib' has no attribute 'figure'
leetcode43 string multiplication
vim configuration + ctag is as easy to read code as source insight
What should I do if the neural network cannot be trained?
类神经网络训练不起来怎么办
2022年湖南工学院ACM集训第六次周测题解
华为Android开发面试后得出的面试秘诀
Selenium:弹窗处理
Robot_Framework: Assertion
Selenium: upload and download files
(more than 2022 cattle school four) A - Task Computing + dynamic programming (sort)
Qt Widget 项目对qml的加载实例
Selenium: Popup Handling