(leetcode每日打卡)秋叶收藏集【动态规划】
LCP 19.秋叶收藏集
算法
动态规划
时间复杂度O(n)
1.题目要求最终形成[红、黄、红]三部分,每部分数量可以不相等,问最终调整操作数量最小是多少。这道题一开始考虑暴力去做,枚举两个分界点,即红黄,黄红之间的分界点的位置,但由于长度是1e5,时间复杂度为O(n^2)级别,故此法作废。
2.通过查看官方题解,了解到这道题可以使用动态规划去做,可以将时间复杂度优化到O(n)级别,为方便查阅复习,现结合自己的理解写下该题解。具体如下:
可以定义一个数组f[i][j],表示符合要求的最小的操作数,即使leaves[]数组从0到i的值符合题目规范的最小的操作数。i的范围是[0,leaves.length),j的范围是[0,2],其中0表示当前叶子为红色(在黄色前面),1表示当前叶子为黄色,2表示当前叶子为红色(在黄色后面)。
初始时f[0][0]的值会由第一片叶子的颜色决定。下面分情况讨论j的不同值的情况:
(1)当j=0时,f[i][0] = f[i-1][0] + isYellow(i)。isYellow函数会根据叶子的颜色返回对应的布尔值;同时需注意j=0这种情况下i最大为leaves.length-3,因为题目要求每部分叶子数量至少为1个;
(2)当j=1时,f[i][1] = min(f[i-1][0],f[i-1][1]) + isRed(i) 。该叶子左面的叶子的颜色可能是红色,也可能是黄色,取形成前面两种情况操作的最小值即可。同时需要判断当前叶子是否黄色。在这种情况下i最大值为leaves.length-2,最小值为1;
(3)当j=2时,f[i][2] = min(f[i-1][1],f[i-1][2]) + isYellow(i);。该叶子左面的叶子的颜色可能是红色,也可能是黄色,取形成前面两种情况操作的最小值即可。同时需要判断当前叶子是否为红色。在这种情况下i最大值为leaves.length-1,最小值为2;
最终返回结果为f[leaves.length - 1]。
C++代码
//一开始是用函数调用的,但超时,故直接判断
class Solution {
public:
/*
bool isYellow(string leaves, int u){
return (leaves[u] == 'y');
}
bool isRed(string leaves, int u){
return (leaves[u] == 'r');
}
*/
int minimumOperations(string leaves) {
int len = leaves.length();
vector<vector<int> > f(len, vector<int>(3, INT_MAX));
//f[0][0] = isYellow(leaves, 0);
f[0][0] = (leaves[0] == 'y');
for(int i = 1; i < len; i++){
int yellow = (leaves[i] == 'y');
int red = (leaves[i] == 'r');
if(i < len - 2){
//f[i][0] = f[i-1][0] + (int)isYellow(leaves, i);
f[i][0] = f[i-1][0] + yellow;
}
if(i >= 1 && i < len - 1){
//f[i][1] = min(f[i-1][0],f[i-1][1]) + (int)isRed(leaves, i);
f[i][1] = min(f[i-1][0],f[i-1][1]) + red;
}
if(i >= 2){
//f[i][2] = min(f[i-1][1],f[i-1][2]) + (int)isYellow(leaves, i);
f[i][2] = min(f[i-1][1],f[i-1][2]) + yellow;
}
}
return f[len - 1][2];
}
};
(leetcode每日打卡)秋叶收藏集【动态规划】的更多相关文章
- LeetCode每日一题打卡组队监督!刷题群!
近 2000 人已经加入共同刷题啦! 群友每天都会在群里给大家讲解算法题 每周日「负雪明烛」组织直播讲题 我相信来看我博客的大部分人都是通过LeetCode刷题过来的.最近发现LeetCode中文网站 ...
- Java - 收藏集 -
Java - 收藏集 - Java 基础思维导图,让 Java 不再难懂 - 工具资源 - 掘金思维导图的好处 最近看了一些文章的思维导图,发现思维导图真是个强大的工具.了解了思维导图的作用之后, ...
- 【JavaScript】【dp】Leetcode每日一题-解码方法
[JavaScript]Leetcode每日一题-解码方法 [题目描述] 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : 'A' -> 1 'B' -> 2 ... 'Z' -& ...
- 【python】Leetcode每日一题-直方图的水量(接雨水)
[python]Leetcode每日一题-直方图的水量(接雨水) [题目描述] 给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1. 上面是由数组 ...
- 【python】Leetcode每日一题-不同的子序列
[python]Leetcode每日一题-不同的子序列 [题目描述] 给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数. 字符串的一个 子序列 是指,通过删除一些(也可以 ...
- [LeetCode每日一题]1143. 最长公共子序列
[LeetCode每日一题]1143. 最长公共子序列 问题 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度.如果不存在 公共子序列 ,返回 0 . 一个字符串 ...
- 【js】Leetcode每日一题-停在原地的方案数
[js]Leetcode每日一题-停在原地的方案数 [题目描述] 有一个长度为 arrLen 的数组,开始有一个指针在索引 0 处. 每一步操作中,你可以将指针向左或向右移动 1 步,或者停在原地(指 ...
- Leetcode 413. Arithmetic Slice 算术序列切片(动态规划,暴力)
Leetcode 413. Arithmetic Slice 算术序列切片(动态规划,暴力) 题目描述 如果一个数组1.至少三个元素2.两两之间差值相同,那么这个数组就是算术序列 比如下面的数组都是算 ...
- Android - 收藏集
Android - 收藏集 https://www.jianshu.com/p/dad51f6c9c4d?utm_campaign=maleskine&utm_content=note& ...
随机推荐
- mybatis逆向工程介绍
项目的model一旦多了起来,复杂了起来,我们很自然的想到使用mybatis的逆向工程来生成相应的pojo和mapper,能节省很多精力. MyBatis Generator(MBG)是 MyBati ...
- flutter 设置状态栏的背景与颜色
flutter 设置状态栏的背景与颜色 导包 import 'dart:io'; import 'package:flutter/services.dart'; 在main()函数中添加以下函数, v ...
- py_正则表达式练习
正则表达式: #正则表达式 #键盘数字6上的符号,^表示行的开始,$ 表示行的结束 #test = "tm queal Tomorrow Moon" ''' ^tm #匹配tm开头 ...
- 阿里面试竟如此轻松,2招带你过关斩将拿下offer
在找工作之前首先是要认清一个问题,虽然这个问题比较俗,但是很现实,就是为什么追求高工资? 这个问题我想不用说大家心里也清楚.大部分人都不是当前城市的本地人,说好听了叫来上班,说的不好听其实叫“外来务工 ...
- MyTerm入选北极代码库计划,喜获「Arctic Code Vault Contributor」勋章
- LeetCode 95 | 构造出所有二叉搜索树
今天是LeetCode专题第61篇文章,我们一起来看的是LeetCode95题,Unique Binary Search Trees II(不同的二叉搜索树II). 这道题的官方难度是Medium,点 ...
- 神奇的BUG系列-01
有时候遇见一个bug,感觉就是他了 其实他也不过是你职业生涯中写的千千万万个bug中的一员 你所要做的,是放下 日子还长,bug很多,不差这一个 就此别过,分手快乐 一辈子那么长,一天没放下键盘 你就 ...
- mysql 8.0.11安装教程
安装环境:win7 1. 下载安装包 下载地址:https://dev.mysql.com/downloads/file/?id=476233 2. 解压zip包 3. 初始化my.ini 创建my. ...
- Android studio Debug 源码
原来有的地方打不了断点 会提示no executable code at line xxx 源码sdk里有,sdkManager下好对应版本,然后使用对应版本的模拟器debug就行了 如果要debug ...
- [MRCTF]Web WriteUp
和武科大WUSTCTF同时打的一场比赛,最后因为精力放在武科大比赛上了,排名13 - -Web题目难度跨度过大,分不清层次,感觉Web题目分布不是很好,质量还是不错的 Ez_bypass 进入题目得 ...