每日一结
279. 完全平方数
在于建立一个从1到所救数字的最优解数组。对于当前所需求的数字,i为当前所需求解的数字
min = Math.min(min, ans[i - j * j])
ans[i] = min + 1
再加上j这个情况即可。
188. 买卖股票的最佳时机 IV
因为题目说可以买入k次,所以当前的持有数组和未持有数组可设为
int[n][k + 1]n为price的长度也就是天数,k为交易数,因为我们假设有零次交易,所以为k+1
初始化为:
buy[0][0] = -prices[0]; //第零天零次交易,为了保障手上有股票,必须买入
sel[0][0] = 0;
for(int i = 1; i <= k; i++) { //初始化第零天
buy[0][i] = Integer.MIN_VALUE/2;
sel[0][i] = Integer.MIN_VALUE/2;
}
接下来的状态转移方程:
买入:
可以是昨天买入的(这就是本人理解的一种编程思想,为什么不是前天大前天而是昨天。因为今天有昨天,昨天也有昨天)
也可以是今天买入(昨天卖出了)(如果今天卖出又买入,显然多此一举,虽然为零但是可以直接pass这种情况)
卖出
:可以是昨天卖出的,也可以是今天卖出(如果今天卖出,那么说明昨天买入了,注意:昨天买入属于是上一次交易了)
最后:
return Arrays.stream(sel[n-1]).max().getAsInt();
309. 最佳买卖股票时机含冷冻期
因为此题新增了一个控制,有冷冻期。很妙的思想是,在状态方面做文章:
// f[i][0]: 手上持有股票的最大收益
// f[i][1]: 手上不持有股票,并且处于冷冻期中的累计最大收益这里的
【「处于冷冻期」指的是在第 i天结束之后的状态。也就是说:如果第 i天结束之后处于冷冻期,那么第 i+1 天无法买入股票。】
// f[i][2]: 手上不持有股票,并且不在冷冻期中的累计最大收益
那么初始化,只需要初始第一种情况,持有。f[0][0] = -prices[0]
状态转移方程:
持有可以是昨天买入,也可以是今天买入(注意,今天能买入,那么昨天则为冷冻期)
不持有且下一天为冷冻期,则昨天一定是买入了的
不持有且不为冷冻期,可以是昨天不持有且为冷冻期;昨天不持有且不为冷冻期
f[i][0] = Math.max(f[i-1][0], f[i-1][2] - prices[i]);
f[i][1] = f[i-1][0] + prices[i];
f[i][2] = Math.max(f[i-1][1], f[i-1][2]);
714. 买卖股票的最佳时机含手续费
基本的初始化买入
buy[0] = -prices[0]
buy[i] = Math.max(buy[i-1], sel[i-1] - prices[i]);//天数【昨天买入的,或者今天买入的】
sel[i] = Math.max(sel[i-1], buy[i-1] + prices[i] - fee);//交易完成之后再付fee【昨天卖出的,或者今天卖出的】
浙公网安备 33010602011771号