秋叶收藏集
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 285 ms, 内存: 16.5 MB
/*
题目思路:
同样使用动态规划的思路,但使用Java Stream处理数据。
dp[0][0] 表示第 0 片叶子在红色部分的最小调整次数,dp[0][1] 表示黄色部分,dp[0][2] 表示第二个红色部分。
我们遍历每一片叶子,根据当前叶子的颜色更新 dp 数组。
*/
import java.util.Arrays;
public class Solution {
public int minimumOperations(String leaves) {
int n = leaves.length();
int[] dp = new int[]{leaves.charAt(0) == 'r' ? 0 : 1, Integer.MAX_VALUE, Integer.MAX_VALUE};
for (int i = 1; i < n; i++) {
int isRed = leaves.charAt(i) == 'r' ? 0 : 1;
int isYellow = leaves.charAt(i) == 'y' ? 0 : 1;
dp = new int[]{
dp[0] + isRed,
Math.min(dp[0], dp[1]) + isYellow,
i >= 2 ? Math.min(dp[1], dp[2]) + isRed : Integer.MAX_VALUE
};
}
return dp[2];
}
}
解释
方法:
该题解采用了动态规划的思想,目标是将字符串调整为红黄红三部分的形式。我们可以将问题看作是在一序列中寻找两个点,将序列分为三部分,并对这三部分进行调整以达到目标形式。题解中,通过枚举黄红分界点的位置,同时计算前面最少的红黄分界点。首先,初始化计算首位置的红叶和黄叶数量,然后逐一检查每个叶子,更新当前的红叶和黄叶数量,并计算不需要调整的字符的最大值。最终,需要的调整次数是总叶子数减去不需要调整的最大字符数。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
在动态规划的解法中,为什么选择以‘红黄分界点的差值’、‘红叶总数’和‘黄叶总数’作为状态表示,这样的状态表示有什么优势?
▷🦆
在更新‘不需要调整的最大字符数’时,使用的公式是`total_r - r + left[1] + y - left[2]`,这个公式是如何推导出来的?
▷🦆
为何在枚举过程中,需要特别关注‘r - y’是否大于‘left[0]’,这个条件的满足对算法有什么影响?
▷