题目:给定⼀个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;⾮负整数 fee 代表了交易股票的⼿续费⽤。
你可以⽆限次地完成交易,但是你每笔交易都需要付⼿续费。如果你已经购买了⼀个股票,在卖出它之前你就不能
再继续购买股票了。
返回获得利润的最⼤值。
let prices = [8, 4, 3, 1, 3, 2, 8, 100, 4, 9, 1, -1, -2];
fee = 2;
prices.push(0); //push一个是为了方便计算ep - tmin的差值
let tmin = prices[0];
let res = 0;
for (let i = 1; i < prices.length; i++) {
const e = prices[i];
const ep = prices[i - 1];
if (e < ep) {
if (ep - tmin > fee) {
res += ep - tmin;
}
tmin = e;
}
}
console.log(res);
贪心思路是在突然价格降低之前卖出,重置最小值,加上降低之前的差值。
let prices = [8, 4, 3, 1, 3, 4, 2, 8, 100, ],
fee = 2
let dp = new Array(prices.length).fill(0).map(() => new Array(2).fill(0))
dp[0] = [-prices[0], 0] //假设一开始就买进 那么最开始的有股票的时候利润为负数,卖出去的利润为零
// 声明dp初始化意义 :dp[i][0]为拥有股票的最大利润 dp[i][1]为没有股票的最大利润
for (let i = 1; i < prices.length; i++) {
const t = dp[i - 1][1] - prices[i] - fee
dp[i][0] = t > 0 ? dp[i - 1][0] : Math.max(dp[i - 1][0], t)
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i])
}
console.log(dp);
动态规划方式就不在纠结那天买的问题 而是以每一天的状态来确定当天的最大利润
let prices = [8, 4, 3, 1, 100, 2, 2, 8, 100, ],
fee = 2
let dp = new Array(prices.length).fill(0).map(() => new Array(2).fill(0))
dp[0] = [-prices[0], 0] //假设一开始就买进 那么最开始的有股票的时候利润为负数,卖出去的利润为零
// 声明dp初始化意义 :dp[i][0]为拥有股票的最大利润 dp[i][1]为没有股票的最大利润
dp[1] = [-prices[1], 0]
for (let i = 2; i < prices.length; i++) {
const t = dp[i - 1][1] - prices[i]-fee
dp[i][0] = Math.max(dp[i - 1][0], t) //买的话可以买当天的 因为考虑了前天没有的情况
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 2][0] + prices[i]) //卖只能卖隔天的
}
console.log(dp);