当前位置:网站首页>LeetCode Question of the Day (309. Best Time to Buy and Sell Stock with Cooldown)
LeetCode Question of the Day (309. Best Time to Buy and Sell Stock with Cooldown)
2022-08-01 05:48: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]的时候, 我们有两个选择, One is to sell the current stock, 然后跳到 i+2(because after the sale 1 天的冷静期), The other is not for sale, then walk normally i+1. We maintain both the current maximum and minimum prices, Similar to a monotonically increasing queue, Used to record the current best buying time and best selling time
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())
}
}
边栏推荐
- 微信小程序获取手机号phonenumber.getPhoneNumber接口开发
- Solve the problem of page flicker caused by browser scroll bars
- What should I do if the neural network cannot be trained?
- JWL-11/2-99.9A电流继电器
- Selenium: Popup Handling
- Selenium:元素定位
- WPF项目-初步了解数据绑定 binding
- 对话MySQL之父:一个优秀程序员可抵5个普通程序员
- 仿牛客网讨论社区项目—项目总结及项目常见面试题
- 微信小程序接口调用凭证(获取token)auth.getAccessToken接口开发
猜你喜欢
随机推荐
2022.7.27好题选讲
Malicious attacks on mobile applications surge by 500%
matlab 风速模型 小波滤波
After the image is updated, Glide loading is still the original image problem
2022/07/29 入职健海JustFE团队,我学到了高效开发(年中总结)
NDK does not contain any platforms问题解决
matplotlib pyplot
A,H,K,N
flinkcdc对mysql的date字段类型转化有什么解决思路么
matlab wind speed model wavelet filtering
Selenium: JS operation
【音视频】srs直播平台搭建
ORACLE modify another user package (package)
小心你的字典和样板代码
数据湖:数据同步工具NiFi
可视化全链路日志追踪
Robot_Framework:断言
Dialogue with the father of MySQL: One excellent programmer is worth 5 ordinary programmers
Selenium: upload and download files
【翻译】确保云原生通信的安全:从入口到服务网及更远的地方









