【C++前后缀分解 动态规划】2100. 适合野炊的日子|1702

本文涉及知道点

C++前后缀分解
C++动态规划

LeetCode2100. 适合野炊的日子

你和朋友们准备去野炊。给你一个下标从 0 开始的整数数组 security ,其中 securityi 是第 i 天的建议出行指数。日子从 0 开始编号。同时给你一个整数 time 。

如果第 i 天满足以下所有条件,我们称它为一个适合野炊的日子:

第 i 天前和后都分别至少有 time 天。

第 i 天前连续 time 天建议出行指数都是非递增的。

第 i 天后连续 time 天建议出行指数都是非递减的。

更正式的,第 i 天是一个适合野炊的日子当且仅当:securityi - time >= securityi - time + 1 >= ... >= securityi <= ... <= securityi + time - 1 <= securityi + time.

请你返回一个数组,包含 所有 适合野炊的日子(下标从 0 开始)。返回的日子可以 任意 顺序排列。

示例 1:

输入:security = 5,3,3,3,5,6,2, time = 2

输出:2,3

解释:

第 2 天,我们有 security0 >= security1 >= security2 <= security3 <= security4

第 3 天,我们有 security1 >= security2 >= security3 <= security4 <= security5

没有其他日子符合这个条件,所以日子 2 和 3 是适合野炊的日子。

示例 2:

输入:security = 1,1,1,1,1, time = 0

输出:0,1,2,3,4

解释:

因为 time 等于 0 ,所以每一天都是适合野炊的日子,所以返回每一天。

示例 3:

输入:security = 1,2,3,4,5,6, time = 2

输出:\[\]

解释:

没有任何一天的前 2 天建议出行指数是非递增的。

所以没有适合野炊的日子,返回空数组。

提示:

1 <= security.length <= 105

0 <= securityi, time <= 105

前后缀分解

n = security.length

lefti 记录 以numsi结尾的最长非递增子数组的长度。

如果lefti <= lefti-1则lefti = lefti-1+1;否则lefti =1 。

righti记录 以numsi开始的最长非递减子数组的长度。

如果lefti和righti大于time,则是好日子。

rightn-1-i 就是nums的转置数组的lefti

代码

打开打包代码的方法兼述单元测试

核心代码

cpp 复制代码
class Solution {
		public:
			vector<int> goodDaysToRobBank(vector<int>& security, int time) {
				m_iN = security.size();
				auto Do = [&](const vector<int>& security) {
					vector<int> ret(m_iN, 1);
					for (int i = 1; i < m_iN; i++) {
						if (security[i] <= security[i - 1]) {
							ret[i] = ret[i - 1] + 1;
						}
					}
					return ret;
				};
				auto left = Do(security);
				auto right = Do(vector<int>(security.rbegin(), security.rend()));
				vector<int> ret;
				for (int i = 0; i < m_iN; i++) {
					if ((left[i] > time) && (right[m_iN - 1 - i] > time)) {
						ret.emplace_back(i);
					}
				}
				return ret;
			}
			int m_iN;
		};

单元测试

cpp 复制代码
	vector<int> security;
		int time;
		TEST_METHOD(TestMethod11)
		{
			security = { 5, 3, 3, 3, 5, 6, 2 }, time = 2;
			auto res = Solution().goodDaysToRobBank(security, time);
			AssertEx({ 2,3 }, res);
		}
		TEST_METHOD(TestMethod12)
		{
			security = { 1,1,1,1,1 }, time = 0;
			auto res = Solution().goodDaysToRobBank(security, time);
			AssertEx({ 0,1,2,3,4 }, res);
		}
		TEST_METHOD(TestMethod13)
		{
			security = { 1,2,3,4,5,6 }, time = 2;
			auto res = Solution().goodDaysToRobBank(security, time);
			AssertEx({  }, res);
		}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17

或者 操作系统:win10 开发环境: VS2022 C++17

如无特殊说明,本算法用**C++**实现。

相关推荐
罗西的思考13 小时前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
美团技术团队16 小时前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
用户805533698031 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
To_OC1 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC1 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK1 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境2 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
_清歌2 天前
DSpark 深度解读:DeepSeek-V4 如何用「半自回归」把推理速度提升 85%
算法
统计实现局2 天前
SVD 的三步走:双对角化、Givens 收敛、排序
算法