LCP-19 秋叶收藏集
题目回顾
小扣出去秋游,途中收集了一些红叶和黄叶,他利用这些叶子初步整理了一份秋叶收藏集 leaves, 字符串 leaves 仅包含小写字符 r 和 y, 其中字符 r 表示一片红叶,字符 y 表示一片黄叶。
出于美观整齐的考虑,小扣想要将收藏集中树叶的排列调整成「红、黄、红」三部分。每部分树叶数量可以不相等,但均需大于等于 1。每次调整操作,小扣可以将一片红叶替换成黄叶或者将一片黄叶替换成红叶。请问小扣最少需要多少次调整操作才能将秋叶收藏集调整完毕。示例 1:
输入:leaves = “rrryyyrryyyrr”
输出:2
解释:调整两次,将中间的两片红叶替换成黄叶,得到 “rrryyyyyyyyrr”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/UlBDOe
解法思路
这题有两种解法,先着重写一下前缀和+动态规划的解法。
要将树叶分成红-黄-红三部分,关键就是要找到2个分界点。不妨将这两个点设为x
,y
.
[0,x-1] 红
[x,y-1] 黄
[y,n-1] 红
那么我们需要操作的次数,就是第一段中黄色的个数、第二段中红色的个数以及第三段中黄色的个数之和,我们的目标就是要找到这个和的最小值。
为了更方便的表示每段中不同颜色的个数,我们可以定义一个前缀和数组,
所以需要进行的操作次数可表示为:
$n-sumR\left[ n-1 \right] $是常数不用管,而观察到x
,y
相关的表达式形式是统一的,因此不妨令
要求op
的最小值,就转化为求$t[x]-t[y]$的最小值,或者说,求$t[y]-t[x],(y>x)$的最小值。那么问题就转化成求股票最大差价的问题了,就是一个典型的动态规划问题。
下面需要关心一下x,y的取值范围。
那么x的范围就是$[1,n-2]$.
因此只需一次遍历t[n]数组,就能得到最大差值。
总体来说,时间复杂度为O(n),空间复杂度也为O(n)。
代码实现
1 | class Solution: |
LCP-19 秋叶收藏集