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.xdnf.cn/news/142678.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

暗月中秋靶场活动writeup

前言 暗月在中秋节搞了个靶场活动&#xff0c;一共有4个flag&#xff0c;本着增长经验的想法参加了本次活动&#xff0c;最终在活动结束的时候拿到了3个flag&#xff0c;后面看了其他人的wp也复现拿到第四个flag。过程比较曲折&#xff0c;所以记录一下。 靶场地址 103.108.…

获得京东商品详情(关键词搜索,店铺所有商品)API接口返回值说明

京东API接口&#xff0c;简单而言&#xff0c;就是一套工具&#xff0c;可以帮助你与京东平台的数据与功能进行智能对接。它能够让你的店铺信息、商品信息、用户数据等信息实现高效流通&#xff0c;帮助你更好地理解客户需求 我们深知数据安全的重要性&#xff0c;因此&#x…

【图像去噪】【TGV 正则器的快速计算方法】通过FFT的总(广义)变化进行图像去噪(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Simulink 封装

快捷键&#xff1a; Edit Mask&#xff1a;CtrlM Look Under Mask&#xff1a;CtrlU 封装之后的模型&#xff1a; Edit Mask界面&#xff1a; 双击模块后的提示界面&#xff1a; 封装的模块内部&#xff1a;

地球的某一片红薯地中秋圆辉少许《乡村振兴战略下传统村落文化旅游设计》——2023学生旅行季许少辉八月新书想象和世界一样宽广

地球的某一片红薯地中秋圆辉少许《乡村振兴战略下传统村落文化旅游设计》——2023学生旅行季许少辉八月新书想象和世界一样宽广 地球的某一片红薯地中秋圆辉少许《乡村振兴战略下传统村落文化旅游设计》——2023学生旅行季许少辉八月新书想象和世界一样宽广

异地恋的甜蜜解药:李哥的群晖Videostation电影分享教程

异地恋的甜蜜解药&#xff1a;李哥的群晖Videostation电影分享教程 文章目录 异地恋的甜蜜解药&#xff1a;李哥的群晖Videostation电影分享教程1.使用环境要求2.制作视频分享链接3.制作永久固定视频分享链接 李哥和他的女朋友是一对甜蜜的情侣&#xff0c;但不幸的是&#xff…

Antolin EDI 对接手册

Antolin是一家国际性的汽车零部件制造商&#xff0c;专门生产和供应汽车内饰和外饰零部件。公司总部位于西班牙&#xff0c;在全球范围内拥有多个制造和分销设施。Antolin的产品范围包括各种汽车内饰部件&#xff0c;如门板、仪表板、中控台、天窗、座椅、地毯和其他装饰件&…

消息中间件相关知识

1、概述 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件&#xff0c;如老牌的ActiveMQ、RabbitMQ&#xff0c;炙手可热的Kafka…

联邦学习 (FL) 中常见的3种模型聚合方法的 Tensorflow 示例

目录 FL的关键概念 实现FL的简单步骤 Tensorflow代码示例 联合学习 (FL) 是一种出色的 ML 方法&#xff0c;它使多个设备&#xff08;例如物联网 (IoT) 设备&#xff09;或计算机能够在模型训练完成时进行协作&#xff0c;而无需共享它们的数据。 “客户端”是 FL 中使用的计…

webp格式及其转成

"WebP" 是一种现代的图像压缩格式&#xff0c;由谷歌公司开发。它旨在提供高质量的图像压缩&#xff0c;同时减小图像文件的大小&#xff0c;从而加快网络加载速度。WebP 格式通常使用 ".webp" 扩展名来标识。 WebP 图像格式主要有以下几个特点和优点&…

基于微信小程序的宠物用品商城设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

使用datax将数据从InfluxDB抽取到TDengine过程记录

1. 编写InfluxDB数据查询语句 select time as ts,device as tbname, ip,device as district_code from "L2_CS" limit 1000 2. 创建TDengine表 create database if not exists sensor; create stable if not exists sensor.water(ts timestamp, ip varchar(50), …

五、核支持向量机算法(NuSVC,Nu-Support Vector Classification)(有监督学习)

和支持向量分类(Nu-Support Vector Classification)&#xff0c;与 SVC 类似&#xff0c;但使用一个参数来控制支持向量的数量&#xff0c;其实现基于libsvm 一、算法思路 本质都是SVM中的一种优化&#xff0c;原理都类似&#xff0c;详细算法思路可以参考博文&#xff1a;三…

day07_方法

今日内容 零、 复习昨日 一、作业讲解 二、方法[重点] 零、 复习昨日 一、作业讲解 package com.qf.homework;import java.util.Scanner;/*** desc*/ public class Homework {public static void main(String[] args) {/*** --------------------* 边写边测试* 以结果倒推* …

为什么引入低代码开发平台是实施数字化转型的关键?

引入低代码开发平台是实施数字化转型的关键&#xff0c;原因如下&#xff1a; 1.加速开发&#xff1a;低代码平台通过抽象和自动化许多编码任务来实现更快的应用程序开发。这种速度对于数字化转型计划至关重要&#xff0c;组织需要快速推出新的数字化解决方案以保持竞争力。 …

Docker(三)、Dockerfile探究

Dockerfile探究 一、镜像层概念1、通过执行命令显化docker的机制 二、Dockerfile基础命令1、FROM 基于基准镜像【即构建镜像的时候&#xff0c;依托原有镜像做拓展】2、LABEL & MAINTAINER -说明信息3、WORKDIR 设置工作目录4、ADD & COPY 复制文件5、ENV 设置环境常量…

外包干了3个月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;大专生&#xff0c;17年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

【乳腺超声、乳腺钼靶、宫颈癌】等项目数据调研,及相关参考内容整理汇总

一、乳腺超声内容整理 1.1、数据集 Breast Ultrasound Images Dataset;下载地址2STU-Hospital处理和训练参考文档:https://blog.csdn.net/weixin_51511389/article/details/127594654 1.2、可以参考的论文 AAU-net: An Adaptive Attention U-net for Breast Lesions Segmen…

Linux学习第20天:Linux按键输入驱动开发: 大道至简 量入为出

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 中国文化博大精深&#xff0c;太极八卦&#xff0c;阴阳交合&#xff0c;变化无穷。在程序的开发中也是这样&#xff0c;数字0和1也是同样的道理。就本节来说&am…

vue实现移动端悬浮可拖拽按钮

需求&#xff1a; 按钮在页面侧边悬浮显示&#xff1b;点击按钮可展开多个快捷方式按钮&#xff0c;从下向上展开。长按按钮&#xff0c;则允许拖拽来改变按钮位置&#xff0c;按钮为非展开状态&#xff1b;按钮移动结束&#xff0c;手指松开&#xff0c;计算距离左右两侧距离…