当前位置: 首页 > news >正文

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

题目链接

Leetcode.2100 适合打劫银行的日子 Rating : 1702

题目描述

你和一群强盗准备打劫银行。给你一个下标从 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<=1051 <= security.length <= 10^51<=security.length<=105
  • 0<=security[i],time<=1050 <= security[i], time <= 10^50<=security[i],time<=105

分析:

适合打劫的那天 security[i](包括第 i天在内),前 time+1天是非递增的,后 time+1天是非递减的。

我们使用 前后缀分解 求解本题。

定义两个数组 left,right

  • left[i]表示,以 security[i]结尾,非递增的连续天数。
  • right[i]表示,以 security[i]结尾,非递减的连续天数。

我们能够遍历的合法区间是 [time,n-time-1]。只要在这个区间内,left[i] >= time+1 && right[i] >= time+1说明第 i天是适合打劫的。

时间复杂度:O(n)O(n)O(n)

C++代码:

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

Java代码:

class Solution {public List<Integer> goodDaysToRobBank(int[] security, int time) {int n = security.length;int[] left = new int[n];int[] right = new int[n];left[0] = 1;for(int i = 1;i < n;i++){left[i] = 1;if(security[i-1] >= security[i]) left[i] += left[i-1];}right[n-1] = 1;for(int i = n - 2;i >= 0;i--){right[i] = 1;if(security[i+1] >= security[i]) right[i] += right[i+1];}List<Integer> res = new ArrayList<>();for(int i = time;i < n - time;i++){if(left[i] >= time + 1 && right[i] >= time + 1) res.add(i);}return res;}
}
http://www.lryc.cn/news/11929.html

相关文章:

  • linux ubuntu查日志信息以及错误排查
  • DOS经典软件,落下帷幕,新型国产平台,蓬勃发展
  • MongoDB数据存储格式
  • ARC126D Pure Straight
  • 基于RK3588的嵌入式linux系统开发(四)——uboot镜像下载(基于RKDevTool工具)
  • 设计模式之策略模式与责任链模式详解和应用
  • 广度优先搜索(BFS)-蓝桥杯
  • Java Type类
  • Springboot扩展点之CommandLineRunner和ApplicationRunner
  • ngixn 常用配置之文件类型与自定义 log
  • 【100个 Unity实用技能】 | Unity 通过自定义菜单将资源导出
  • 0.3调试opencv源码的两种方式
  • Redis的常见操作和Session的持久化
  • TypeScript笔记(二)
  • 【MyBatis】源码学习 03 - 类型处理器 TypeHandler
  • 建造《流浪地球2》中要毁灭人类的超级量子计算机MOSS的核心量子技术是什么?
  • 数据结构~七大排序算法(Java实现)
  • python练习
  • RPC-thrift实践
  • Maven:工程的拆分与聚合
  • 使用uniapp创建小程序和H5界面
  • 密度峰值聚类算法(DPC)
  • RabbitMQ相关问题
  • 操作系统 三(存储管理)
  • day34 贪心算法 | 860、柠檬水找零 406、根据身高重建队列 452、用最少数量的箭引爆气球
  • 使用canvas给上传的整张图片添加平铺的水印
  • [安装之4] 联想ThinkPad 加装固态硬盘教程
  • Java数据类型、基本与引用数据类型区别、装箱与拆箱、a=a+b与a+=b区别
  • GoLang设置gofmt和goimports自动格式化
  • 【k8s】如何搭建搭建k8s服务器集群(Kubernetes)