LeetCode 2100.适合打劫银行的日子

【LetMeFly】2100.适合打劫银行的日子

现在力扣上好像改题面为2100. 适合野炊的日子了。

力扣题目链接:https://leetcode.cn/problems/find-good-days-to-rob-the-bank/

你和一群强盗准备打劫银行。给你一个下标从 0 开始的整数数组 security ,其中 security[i] 是第 i 天执勤警卫的数量。日子从 0 开始编号。同时给你一个整数 time 。

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

  • i 天前和后都分别至少有 time 天。
  • i 天前连续 time 天警卫数目都是非递增的。
  • i 天后连续 time 天警卫数目都是非递减的。

更正式的,第 i 天是一个合适打劫银行的日子当且仅当:security[i - time] >= security[i - time + 1] >= ... >= security[i] <= ... <= security[i + time - 1] <= security[i + time].

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

 

示例 1:

输入:security = [5,3,3,3,5,6,2], time = 2
输出:[2,3]
解释:
第 2 天,我们有 security[0] >= security[1] >= security[2] <= security[3] <= security[4] 。
第 3 天,我们有 security[1] >= security[2] >= security[3] <= security[4] <= security[5] 。
没有其他日子符合这个条件,所以日子 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 <= security[i], time <= 105

思路

方法一:分类讨论

<small时间复杂度 O ( n ) O(n) O(n),空间复杂度O(1),难度※※** </smtps://leetcode-cn.com/problems/find-good-days-to-rob-the-bank/solution/letmefly-fen-lei-tao-lun-on-o1-by-letmef-1jgw/](https://img-blog.csdnimg.cn/img_convert/ca4a6ec46181f3756420620dbe776075.jpeg)

t i m e = 0 time=0 time=0的情况特殊考虑 插入链接与图片

因此我们使用两个变量 l i a n X u X i a D a y s lianXuXiaDays lianXuXiaDays(表示非递增的天数)和 c o u l d A s U p 4 B e g i n couldAsUp4Begin couldAsUp4Begin(从此以后可以开始非递减的那一天)

也就是说,在连续 l i a n X u X i a D a y s lianXuXiaDays lianXuXiaDays天的非递增后,若 l i a n X u X i a D a y s ≥ t i m e lianXuXiaDays\geq time lianXuXiaDaystime,那么只要从今天起的连续 t i m e time time天都非递减,今天就“抢劫日”。

所以我们在 l i a n X u X i a D a y s ≥ t i m e lianXuXiaDays\geq time lianXuXiaDaystime时,就可以将 c o u l d A s U p 4 B e g i n couldAsUp4Begin couldAsUp4Begin记为今天。

若之后的 t i m e time time天及以上都非递减,那么此时记录的 c o u l d A s U p 4 B e g i n couldAsUp4Begin couldAsUp4Begin就是一个“抢劫日”。

因此在向后的遍历中,如果仍然处于非递减状态,就可以判断是否有 c o u l d A s U p 4 B e g i n couldAsUp4Begin couldAsUp4Begin,如果有( ≠ − 1 \neq -1 =1)就判断今天距离 c o u l d A s U p 4 B e g i n couldAsUp4Begin couldAsUp4Begin是否 ≥ t i m e \geq time time天,如果 ≥ t i m e \geq time time,就说明 c o u l d A s U p 4 B e g i n couldAsUp4Begin couldAsUp4Begin后的连续 t i m e time time天都是非递减,因此 c o u l d A s U p 4 B e g i n couldAsUp4Begin couldAsUp4Begin就是一个抢劫日。

更加详细的描述可参考注释

AC代码

C++
class Solution {
public:vector<int> goodDaysToRobBank(vector<int>& security, int time) {if (!time) {  // time = 0,每天都是“打劫日”vector<int> ans(security.size());  // 答案共有security.size()天for (int i = 0; i < security.size(); i++) {ans[i] = i;  // 第i个答案是第i天}return ans;}vector<int> ans;int lianXuXiaDays = 0;  // 连续↓或→的天数int couldAsUp4Begin = -1;  // 最早可以认为是开始连续上升的那一天 | 如果couldAsUp4Begin=a≠-1,说明第a天之前至少有time天的非递增for (int i = 1; i < security.size(); i++) {  // 从第二天开始遍历if (security[i] < security[i - 1]) {  // ↓lianXuXiaDays++;  // 连续非递增天数++if (lianXuXiaDays >= time) {  // 如果连续非递增天数≥time,那么今天之前就有≥time的非递减couldAsUp4Begin = i;  // 从今天开始可以非递减了}else {  // 还没有连续非递增time天couldAsUp4Begin = -1;}}else if (security[i] == security[i - 1]) {  // 今天和昨天相等,也就是说既符合非递增又符合非递减lianXuXiaDays++;  // 符合非递增,连续非递增天数++if (couldAsUp4Begin != -1) {  // 前面有≥time的非递减,并且从那天起没有递增的一天 | Lable1if (i - couldAsUp4Begin >= time) {  // 如果今天距离那天≥time,那天就是抢劫日ans.push_back(couldAsUp4Begin);  // 先把抢劫日添加到答案中去if (security[couldAsUp4Begin + 1] <= security[couldAsUp4Begin]) {  // 如果抢劫日的下一天仍然是非递增,那么下一天之前肯定有至少time天的非递增couldAsUp4Begin++;  // 下一天也可以作为开始非递减的一天}else {  // 否则couldAsUp4Begin = -1;  // 下一天>这个抢劫日,说明下一天必不满足“前面有至少time天的非递增”}}}else {  // couldAsUp4Begin = -1if (lianXuXiaDays >= time) {  // 连续非递增天数≥timecouldAsUp4Begin = i;  // 从今天起可以开始非递减了}}}else {  // 今 > 昨lianXuXiaDays = 0;  // 连续非递减天数中断if (couldAsUp4Begin != -1) {  // 这个同理于上面的“Lable1”处if (i - couldAsUp4Begin >= time) {ans.push_back(couldAsUp4Begin);if (security[couldAsUp4Begin + 1] <= securmai ty[coul AsUp4Begin])   {                     couldA Up4B gectin++;}已完成          else {}couldA     }}
Up4Begin = -1;}}}}return ans;  // 返回答案即可}
};

方法二

时间复杂度 O ( n ) O(n) O(n),空间复杂度O(n),难度※

这种方法比上一种方法更容易实现,但是空间复杂度比上种方法要高。

我们可以用 O ( n ) O(n) O(n)的时间复杂度求出每一天的“之前的连续非递增天数”和“之后的连续非递减天数”

x i a [ i ] xia[i] xia[i]表示第 i i i天之前有几天非递增, s h a n g [ i ] shang[i] shang[i]表示第 i i i天之前有几天非递减

具体方法: 从前向后遍历数组,如果 今天≤昨天,那么 xia[i] = xia[i - 1] + 1;否则, xia[i] = 0。初始值 xia[0] = 0 从后向前遍历数组,如果 今天≤昨天,那么 shang[i] = shang[i + 1] + 1;否则, shang[i] = 0。初始值 shang[security.size() - 1] = 0

然后我们遍历每一天,如果某天同时满足 x i a [ i ] ≥ t i m e xia[i]\geq time xia[i]time s h a n g [ i ] ≥ t i m e shang[i] \geq time shang[i]time,这天就是抢劫日。

AC代码

C++
class Solution {
public:vector<int> goodDaysToRobBank(vector<int>& security, int time) {vector<int> xia(security.size());vector<int> shang(security.size());xia[0] = 0, shang[shang.size() - 1] = 0;for (int i = 1; i < security.size(); i++) {xia[i] = security[i] > security[i - 1] ? 0 : xia[i - 1] + 1;}for (int i = security.size() - 2; i >= 0; i--) {shang[i] = security[i] > security[i + 1] ? 0 : shang[i + 1] + 1;}vector<int> ans;for (int i = 0; i < security.size(); i++) {if (xia[i] >= time && shang[i] >= time)ans.push_back(i);}return ans;}
};

同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/133324938

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/88525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索创意的新辅助,AI与作家的完美合作

在现代社会&#xff0c;文学创作一直是人类精神活动中的重要一环。从古典文学到现代小说&#xff0c;从诗歌到戏剧&#xff0c;作家们以他们的独特视角和文学天赋为我们展示了丰富多彩的人生世界。而近年来&#xff0c;人工智能技术的快速发展已经渗透到各行各业&#xff0c;文…

JavaWeb 学习

1. 基本概念 1.1 Web web&#xff1a;网络&#xff0c;网页 静态 web html&#xff0c;css提供给所有人看的数据始终不会变化 动态 web 淘宝提供给每个人看的数据会有所不同技术栈&#xff1a;Servlet/JSP&#xff0c;ASP&#xff0c;PHP Java 中&#xff0c;动态 web 资…

【神印王座】悲啸洞穴之物揭晓,圣采儿差点被骗,幸好龙皓晨聪明

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析神印王座。 神印王座动漫现阶段已经出到龙皓晨等人接取新任务深入魔族地界的阶段&#xff0c;而龙皓晨等人接取的任务想必现在大家都知道了&#xff0c;那就是探索魔族地界中的悲啸洞穴。但是大家知道悲啸洞穴里面藏着什么…

缓冲区溢出漏洞分析

一、实验目的 熟悉软件安全需求分析方法&#xff0c;掌握软件安全分析技术。 二、实验软硬件要求 1、操作系统&#xff1a;windows 7/8/10等 2、开发环境&#xff1a;VS 6.0&#xff08;C&#xff09;、OllyDbg 三、实验预习 《软件安全技术》教材第3章 四、实验内容&#…

CSS滚动条详解(::-webkit-scrollbar )

滚动条出现的事件&#xff1a; 当设置定宽或者定高的元素添加overflow:scroll属性&#xff0c;会出现滚动条&#xff0c;但是原生样式的会比较丑影响美观。 <div class"content"><div class"contain"></div> </div>.content {wid…

字符串相似度算法

相似度算法 Jaccard Similarity Coefficient、JaroWinkler 、Cosine Similarity、Levenshtein 距离编辑算法案例。 Jaccard相似性系数衡量两个集合的相似程度&#xff0c;通过计算两个集合的交集大小除以并集大小得出。适用于处理文本、推荐系统、生物信息学等领域Cosine Simil…

CleanMyMac X版本4.14.2中文版新功能介绍

CleanMyMac X版本4.14.2中文版是一款专业的Mac清理工具&#xff0c;只需要一键智能清理&#xff0c;便能让Mac恢复原始的性能&#xff0c;是MAC系统非常好用的工具。CleanMyMac X自身拥有一个安全数据库&#xff0c;它是一个项目列表&#xff0c;拥有一定的规格&#xff0c;可以…

CPU访问一个虚拟地址的整体流程

一、虚拟地址转换成物理地址 涉及到的部件&#xff1a; MMU&#xff1a;虚拟地址—MMU—>物理地址。MMU会控制整个流程&#xff08;查快表、查慢表等等&#xff09;TLB快表&#xff1a;组号&#xff08;若为组相联TLB&#xff09;、TLB标记、有效位、页框号页表&#xff08…

数据结构与算法(C语言版)P6---队列

1、队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除操作的特殊线性表&#xff0c;队列具有__先进先出__FIFO&#xff08;First In First Out&#xff09; 入队列&#xff1a;进行插入操作的一端称为__队尾__。 出队列&#xff1a;…

正则表达式语法与应用案例

正则表达式语法 正则表达式&#xff08;Regular Expression&#xff0c;缩写为Regex或RegExp&#xff09;的语法主要包括以下几个方面&#xff1a; 单个字符匹配&#xff1a;可以使用普通字符、元字符、字符集和反义字符来匹配一个单个字符。重复匹配&#xff1a;使用量词元字…

Cpp/Qt-day040920Qt

目录 时钟 头文件&#xff1a;Widget.h: 源文件:Widget.c: 效果图&#xff1a; 思维导图 时钟 头文件&#xff1a;Widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QPainter> #include <QTime>…

性能测试 —— 性能测试常见的测试指标 !

一、什么是性能测试 先看下百度百科对它的定义&#xff0c;性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 我们可以认为性能测试是&#xff1a;通过在测试环境下对系统或构件的性能进行探测&#xff0c;用以验证在生产环…

Java爬虫教程:从入门到精通

引言&#xff1a; 在互联网时代&#xff0c;海量的数据被存储在各种网页中。而Java作为一门强大的编程语言&#xff0c;具备丰富的网络编程能力&#xff0c;可以帮助开发者高效地获取和处理网络数据。本教程将带您从入门到精通&#xff0c;学习如何使用Java编写爬虫程序&#…

安防视频/集中云存储平台EasyCVR(V3.3)部分通道显示离线该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

it运维监控主要做什么

IT运维监控已成为企业经营的重要组成部分。为了保证全面高效的运行&#xff0c;提升企业的经营效率和服务水平&#xff0c;主要从事对企业的IT基础设施进行监控和管理。所以&#xff0c;IT运维监控的关键是什么&#xff1f; IT运维监控的主要任务是确保IT基础设施的正常使用。它…

Gitee使用用户名密码登录一直错误/IDEA连接gitee仓库密码错误

天坑,注册的时候名字带了大写,用户名自动给你变成小写 真正的用户名在个人主页里面看,是后面的字符,才是真正的用户名.排查了一个小时密码问题,真的坑

百度SEO优化不稳定的原因分析(提升网站排名的稳定性)

百度SEO优化不稳定介绍蘑菇号-www.mooogu.cn SEO不稳定是指网站在搜索引擎中的排名不稳定&#xff0c;随着时间的推移会发生变化。这种情况可能会出现在网站页面结构、内容质量、外链质量等方面存在缺陷或不合理之处。因此&#xff0c;优化SEO非常重要&#xff0c;可以提高网站…

Gateway网关

网关GateWay 官方文档&#xff1a;https://docs.spring.io/spring-cloud-gateway/docs/3.1.2/reference/html/#gateway-how-it-works 核心概念 路由: 网关的核心数据结构&#xff0c;定义了网关如何处理请求. 一条路由信息包含路由的唯一标识ID,目的地URI, 一组断言&#xf…

融云 CallPlus + X,通话场景一站式解决方案

融云近期上线的 CallPlus SDK&#xff0c;针对音视频呼叫场景单独设计后端服务 Call Server&#xff0c;信令延时低至 150ms&#xff0c;确保各端计时准确、一致&#xff1b;上线了音视频通话互转、灵活的多人通话、通话记录管理能力等功能。关注【融云全球互联网通信云】了解更…

regsvr32 initpki.dll找不到指定模块要怎么解决?教你快速修复initpki.dll文件

当你尝试在 Windows 操作系统中注册 DLL 文件时&#xff0c;可能会遇到错误消息&#xff1a;“regsvr32 initpki.dll找不到指定模块”。它通常是由于一个或多个 DLL 文件缺失或损坏所导致的。这是一个常见的错误&#xff0c;并且可以遇到在 Windows 7、Windows 8 和 Windows 10…