leetcode
leetcode 2851 ~ 2900
秋叶收藏集

秋叶收藏集

难度:

标签:

题目描述

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)

代码细节讲解

🦆
在动态规划的解法中,为什么选择以‘红黄分界点的差值’、‘红叶总数’和‘黄叶总数’作为状态表示,这样的状态表示有什么优势?
在动态规划中采用‘红黄分界点的差值’(r-y)、‘红叶总数’和‘黄叶总数’作为状态表示,主要是因为这些状态能够有效地描述当前遍历到的叶子位置前所有叶子的累计属性,并为后续的状态转移提供必要的信息。‘红黄分界点的差值’(r-y)帮助我们定位到在当前和之前的叶子中,哪个位置的累积红黄叶差值最大,这有助于确定最优的红黄分界点位置。通过记录这些信息,算法可以在遍历叶子时动态调整和计算不同分界点情况下的最优解,而不需要对每一个可能的分界点进行独立计算,从而大大提高了效率。
🦆
在更新‘不需要调整的最大字符数’时,使用的公式是`total_r - r + left[1] + y - left[2]`,这个公式是如何推导出来的?
公式`total_r - r + left[1] + y - left[2]`用于计算在当前叶子位置作为黄红分界点时,不需要调整的最大字符数。这里,`total_r`代表整个叶子序列中的红叶总数。`r`是当前位置之前的红叶数,`y`是当前位置之前的黄叶数。`left[1]`代表在之前的最优分界点之前的红叶总数,`left[2]`代表在之前的最优分界点之前的黄叶总数。这个公式实际上计算的是,固定当前位置作为黄红分界点,找到之前最优的红黄分界点(使得红黄差值最大),并计算通过这种分割方式能够保持不变的红叶和黄叶的数量,从而推导出最少需要调整的叶子数量。
🦆
为何在枚举过程中,需要特别关注‘r - y’是否大于‘left[0]’,这个条件的满足对算法有什么影响?
在枚举过程中,关注‘r - y’是否大于‘left[0]’的原因是为了更新并寻找最优的红黄分界点。这里,‘r - y’表示当前位置的红叶和黄叶的差值,而‘left[0]’存储之前遍历过程中遇到的最大的红黄叶差值。如果当前的‘r - y’大于‘left[0]’,说明在当前位置之前存在一个更优的红黄分界点,可以使得红叶和黄叶之间的差值更大,这对于之后的黄红转换会更有利。因此,更新这个最大差值和对应的统计数值(红叶总数和黄叶总数),可以帮助算法在后续的计算中找到更少调整次数的方案。

相关问题