【LeetCode每日一题】[中等]LCP 19. 秋叶收藏集
LCP 19. 秋叶收藏集
题目来源
算法思想:动态规划
题目:
思路来源
一共n片树叶,第i片可能为r,也可能为y,前i片最终要和后面的树叶连起来,组合ryr模式,因此需要总结出前i片什么样的模式才能与后面的树叶结合起来共同组成ryr模式。
- r模式,即全为r,后面跟yr即可组成ryr模式。
- ry模式,后面跟r即可组成ryr模式。
- ryr模式,后面跟r即可组成ryr模式。
以y开头的模式,全不符合。
所以前i片树叶组成的模式一共3种:r模式,ry模式,ryr模式
那么前i-1片也是这3种模式,每个模式修改树叶数量用变量r,ry,ryr记录
第i片树叶为r的情况下:
- r模式,r模式可以由前i-1片的r模式跟第i片直接组成,无需修改,修改数量跟之前相同为r
- ry模式,将本片树叶修改为y,与前i-1片树叶的r模式或者ry模式组合均可,取两者中比较小的:min(r, ry) + 1
- ryr模式,与前i-1片树叶的ry模式或者ryr模式直接组合即可,无需修改,取两者中比较小的:min(ry, ryr)
第i片树叶为y的情况下:- r模式,r + 1
- ry模式,min(r, ry)
- ryr模式,min(ry, ryr) + 1
java代码
class Solution {
public int minimumOperations(String leaves) {
char[] leavf = leaves.toCharArray();
//表示i叶片加入之前的三种模式,r,ry,ryr;调整的最小次数
int r = 0;
int ry = Integer.MAX_VALUE;
int ryr = Integer.MAX_VALUE;
//表示i叶片加入之后的三种模式,r,ry,ryr;调整的最小次数
int rtemp = 0;
int rytemp = 0;
int ryrtemp = 0;
if (leavf[0] == 'y') {
leavf[0] = 'r';
r = 1;
}//初始条件,第一个是y,则进行调整r=1,然后更新r,ry,ryr模式数值
for (int i = 0; i < leavf.length; i++) {
if (leavf[i] == 'r') {
//叶片为红色
//r = r; 红色直接加入.不需要调整
rytemp = Math.min(r, ry) + 1;//将叶片调换黄色(+1),可以与i-1时的r模式,ry模式结合,两者取最小值
ryrtemp = Math.min(ry, ryr);//不换色,可以与i-1时的ry模式,ryr模式结合,两者取最小值
//r = rtemp;
ry = rytemp;
ryr = ryrtemp;
}
if (leavf[i] == 'y') {
//叶片是黄色
rtemp = r + 1;//调换颜色(+1),可以与i-1时的r模式结合
rytemp = Math.min(r, ry);//不换色,可以与i-1时的r模式,ry模式结合,两者取最小值
ryrtemp = Math.min(ry, ryr) + 1;//调换颜色(+1),可以与i-1时的ry模式,ryr模式结合,两者取最小值
r = rtemp;
ry = rytemp;
ryr = ryrtemp;
}
}
return ryr;
}
}