(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];
}
};
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 接口测试框架实战(五) | 测试数据的数据驱动
- Linux下使用 github+hexo 搭建个人博客04-next主题优化
- Linux下使用 github+hexo 搭建个人博客05-next主题接入评论系统 来必力畅言Valine获取 livere_uid在Next主题配置浏览器访问数据
- Linux下使用 github+hexo 搭建个人博客06-next主题接入数据统计
- egg.js 动态转发代理
- Linux下使用 github+hexo 搭建个人博客07-next主题接入搜索和站点管理
- Linux curl 命令详解
- Linux curl 常用示例
- Linux curl 表单登录或提交与cookie使用
- Rsync 服务部署与参数详解
- Linux 查看磁盘IO并找出占用IO读写很高的进程
- Linux tcpdump 命令详解与示例
- 手动搭建Hadoop分布式集群
- Ansible-安装配置
- React-Redux 100行代码简易版探究原理。