码迷,mamicode.com
首页 > 其他好文 > 详细

LCP 19.秋叶收藏集

时间:2020-10-05 21:51:57      阅读:17      评论:0      收藏:0      [点我收藏+]

标签:颜色   状态   etc   opera   必须   public   多少   需要   使用   

本题是leetcode中难度系数中等题,字节跳动题库中的题目,思路技巧性比较强,感觉是一道比较典型的题目,特此记录下来,方便后续的思考复盘。

题目描述:小扣出去秋游,途中收集了一些红叶和黄叶,他利用这些叶子初步整理了一份秋叶收藏集 leaves, 字符串 leaves 仅包含小写字符 r 和 y, 其中字符 r 表示一片红叶,字符 y 表示一片黄叶。
出于美观整齐的考虑,小扣想要将收藏集中树叶的排列调整成「红、黄、红」三部分。每部分树叶数量可以不相等,但均需大于等于 1。每次调整操作,小扣可以将一片红叶替换成黄叶或者将一片黄叶替换成红叶。请问小扣最少需要多少次调整操作才能将秋叶收藏集调整完毕。

分析思考

本题是求最小次数,这类题型一般来说应该是要用动态规划进行求解的,这里面对红黄树叶的数量并没有什么限制,唯一限制的条件是树叶的排列顺序是红黄红,而且每一部分不能有其他颜色的,及不能有颜色夹杂在其中;先开始的时候,我的思路出现了问题,只是简单的考虑到前面的那一部分一定是红色,及设置双指针先找到黄色的前后位置,然后确定好黄色部分的范围后,再遍历黄色部分,将红色改成黄色,计算总的次数;但是这里有个问题,及黄色第一次出现的位置是不能确定的,状态不确定所以才需要采用动态规划。这里,我觉得一个那么难点就是动态数组的定义以及状态如何进行转移,按照普通的动态规划定义,我遇到一个难点就是,怎么定义后面的颜色和前面的颜色是一样的或者是不一样的,因为我们必须考虑到相同颜色的连续性。
官方给出了一个很好的思路,动态数组定义为二维数组,dp[i][j]定义为在位置i时,处于状态j的最小调整次数。这里,状态j有三种状态:0(当前位置前一部分为红色),1(当前位置为黄色部分),2(当前位置后面为红色部分)。当位置处于0时,必须为红色,所以边界条件dp[0][0] = isyellow(0)——判断开始时是否黄色,是就置为1,及转为红色的次数。那么我们可以写出状态转移方程了:

  • dp[i][0] = dp[i-1][0]+isyellow(i)
  • dp[i][1] = min{dp[i-1][0],dp[i-1][1]}+isred(i)
  • dp[i][2] = min{dp[i-1][1],dp[i-1][2]}+isyellow(i)
    具体的代码如下所示:
class Solution {
public:
    int minimumOperations(string leaves) {
        int n = leaves.size();
        vector<vector<int>> f(n, vector<int>(3));
        f[0][0] = (leaves[0] == ‘y‘);
        f[0][1] = f[0][2] = f[1][2] = INT_MAX;
        for (int i = 1; i < n; ++i) {
            int isRed = (leaves[i] == ‘r‘);
            int isYellow = (leaves[i] == ‘y‘);
            f[i][0] = f[i - 1][0] + isYellow;
            f[i][1] = min(f[i - 1][0], f[i - 1][1]) + isRed;
            if (i >= 2) {
                f[i][2] = min(f[i - 1][1], f[i - 1][2]) + isYellow;
            }
        }
        return f[n - 1][2];
    }
};

后面再思考,还有哪里可以进行改进的呢,这里是使用了二维数组,那么我们能进行状态压缩来减少空间复杂度呢?后面可以尝试了这种思路进行一下解法的改进。

LCP 19.秋叶收藏集

标签:颜色   状态   etc   opera   必须   public   多少   需要   使用   

原文地址:https://www.cnblogs.com/wushupei/p/13763057.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!