746.使用最小花费爬楼梯
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201117101206353.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ2MDc4MQ==,size_16,color_FFFFFF,t_70#pic_center)
分析
- 到达第i级台阶的阶梯顶部的最小花费,有两个选择:
- 先付出最小总花费minCost[i-1]到达第i级台阶(即第i-1级台阶的阶梯顶部),踏上第i级台阶需要再花费cost[i],再迈一步到达第i级台阶的阶梯顶部,最小总花费为minCost[i-1] + cost[i]);
- 先付出最小总花费minCost[i-2]到达第i-1级台阶(即第i-2级台阶的阶梯顶部),踏上第i-1级台阶需要再花费cost[i-1],再迈两步跨过第i级台阶直接到达第i级台阶的阶梯顶部,最小总花费为minCost[i-2] + cost[i-1]);
- 则minCost[i]是上面这两个最小总花费中的最小值。
- minCost[i] = min(minCost[i-1] + cost[i], minCost[i-2] + cost[i-1])。
- 台阶的数组从0开始计数。可以用-1代表地面,并设cost[-1] = 0。
- 最小总花费的初始值为:
- 第0级台阶: minCost[0] = min(cost[-1], cost[0]) = min(0, cost[0]) = 0
- 第1级台阶: minCost[1] = min(cost[0], cost[1])
class Solution {
public int minCostClimbingStairs(int[] cost) {
int minCost0 = 0;
int minCost1 = Math.min(cost[0], cost[1]);
int minCost = 0;
for(int i = 2; i < cost.length; i++) {
minCost = Math.min(minCost1 + cost[i], minCost0 + cost[i - 1]);
minCost0 = minCost1;
minCost1 = minCost;
}
return minCost;
}
}
796.旋转字符串(高频考点,KMP)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201117114703991.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ2MDc4MQ==,size_16,color_FFFFFF,t_70#pic_center)
分析
class Solution {
public boolean rotateString(String A, String B) {
return A.length() == B.length() && (A + A).contains(B);
}
}