代码编织梦想

原题链接:力扣


描述:

你和一群强盗准备打劫银行。给你一个下标从 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 天警卫数目是非递增的。
所以没有适合打劫银行的日子,返回空数组。
示例 4:

输入:security = [1], time = 5
输出:[]
解释:
没有日子前面和后面有 5 天时间。
所以没有适合打劫银行的日子,返回空数组。
 

提示:

1 <= security.length <= 105
0 <= security[i], time <= 105

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-good-days-to-rob-the-bank
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

* 解题思路:* 这题的长度是10^5,那么时间复杂度一定是O(n),最高O(n*lngN)级别* 我们可以使用动态区间的方案。设置两个区间,left区间和right区间,长度为time。* left区间从0开始,right区间从time开始。* left区间中,如果新读取的数字,比上一个数字小于等于,则leftNum,表示连续递减的区间数量+1。反之则清0。* right区间原理类似。* 这样我们就可以求得leftNum和rightNum,分别代表左右区间连续的数量。如果数量大于等于time,则加入到list当中。* 当然,其实rightNum记录的并不仅仅是index右侧的连续区间数量,不过这对结果没有影响,就不去处理了。

代码:

public class Solution2100 {    public List<Integer> goodDaysToRobBank(int[] security, int time) {        ArrayList<Integer> list = new ArrayList<>();        int index = 0;        int leftNum = 0;//单调递减        int rightNum = 0;//单调递增        while (index + time < security.length) {            if (index > 0) {                if (security[index] <= security[index - 1]) {                    leftNum++;                } else {                    leftNum = 0;                }                if (security[index + time] >= security[index + time - 1]) {                    rightNum++;                } else {                    rightNum = 0;                }            }            if (leftNum >= time && rightNum >= time) {                list.add(index);            }            index++;        }        return list;    }}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/rzleilei/article/details/123350698

leetcode-198强盗抢劫(动态规划)_wxx_dlut的博客-爱代码爱编程

题目:你是一个专业的强盗,计划在街上抢劫房屋。 每个房子都藏着一定数量的钱,阻止你抢劫他们的唯一限制因素是相邻的房屋有连接的安全系统,如果两个相邻的房子在同一个晚上被闯入,它将自动联系警方。给出一个代表每个房子的金额的非负整数列表,确定今晚可以抢劫的最大金额而不警告警察。 Input: [2,7,9,3,1] Output: 12 Explanation

Leetcode--打劫家舍-爱代码爱编程

打劫家舍 题目描述:分析1:代码1:分析2:注意事项: 题目描述: 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一

[Python]lintcode 392. 打劫房屋假设你是一个专业的窃贼,准备沿着一条街打劫房屋。 算一算,如果今晚去打劫,在不触动报警装置的情况下, 你最多可以得到多少钱-爱代码爱编程

lintcode 392. 打劫房屋 假设你是一个专业的窃贼,准备沿着一条街打劫房屋。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。 给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,在不触动报警装置的情况下, 你最多可以得到多少钱

1716. 计算力扣银行的钱-爱代码爱编程

Hercy 想要为购买第一辆车存钱。他 每天 都往力扣银行里存钱。 最开始,他在周一的时候存入 1 块钱。从周二到周日,他每天都比前一天多存入 1 块钱。在接下来每一个周一,他都会比 前一个周一 多存入 1 块钱。 给你 n ,请你返回在第 n 天结束的时候他在力扣银行总共存了多少块钱。   示例 1: 输入:n = 4 输出:10 解释:第 4

leetcode(动态规划专题)-爱代码爱编程

动态规划 1.导论2.基础题目2.1 509. 斐波那契数2.2 70. 爬楼梯2.3 746. 使用最小花费爬楼梯2.4 62. 不同路径2.5 63. 不同路径 II2.6 343. 整数拆分2.7 96. 不同的二叉搜索树2.8 2110. 股票平滑下跌阶段的数目2.9 2100. 适合打劫银行的日子3.背包问题3.1 416. 分割等和子集

第 67 场双周赛T2.5935. 适合打劫银行的日子-爱代码爱编程

解题思路 前缀和思想 两次遍历 用pre记录第i天前非连续递增天数 after记录第i天后非连续递减的天数 如果pre和after都大于time,那么说明第i天符合要求 代码 class Solution { public List<Integer> goodDaysToRobBank(int[] security, int ti

leetcode 适合打劫银行的日子-爱代码爱编程

你和一群强盗准备打劫银行。给你一个下标从 0 开始的整数数组 security ,其中 security[i] 是第 i 天执勤警卫的数量。日子从 0 开始编号。同时给你一个整数 time 。 如果第 i 天满足以下所有条件,我们称它为一个适合打劫银行的日子: 第 i 天前和后都分别至少有 time 天。第 i 天前连续 time 天警卫数目都是非递增

力扣解法汇总1716-计算力扣银行的钱-爱代码爱编程

原题链接:力扣 描述: Hercy 想要为购买第一辆车存钱。他 每天 都往力扣银行里存钱。 最开始,他在周一的时候存入 1 块钱。从周二到周日,他每天都比前一天多存入 1 块钱。在接下来每一个周一,他都会比 前一个周一 多存入 1 块钱。 给你 n ,请你返回在第 n 天结束的时候他在力扣银行总共存了多少块钱。 示例 1: 输入:n =

​力扣解法汇总38-外观数列-爱代码爱编程

原题链接:力扣 描述: 给定一个正整数 n ,输出外观数列的第 n 项。 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列: countAndSay(1) = "1" countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字

力扣解法汇总2029-石子游戏 IX-爱代码爱编程

原题链接:力扣 描述: Alice 和 Bob 再次设计了一款新的石子游戏。现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值。给你一个整数数组 stones ,其中 stones[i] 是第 i 个石子的价值。 Alice 和 Bob 轮流进行自己的回合,Alice 先手。每一回合,玩家需要从 stones 中移除任一石子。 如果玩家

力扣解法汇总969- 煎饼排序-爱代码爱编程

原题链接:力扣 描述: 给你一个整数数组 arr ,请使用 煎饼翻转 完成对数组的排序。 一次煎饼翻转的执行过程如下: 选择一个整数 k ,1 <= k <= arr.length 反转子数组 arr[0...k-1](下标从 0 开始) 例如,arr = [3,2,1,4] ,选择 k = 3 进行一次煎饼翻转,反转子数组 [3,2

力扣解法汇总2043-简易银行系统-爱代码爱编程

目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms https://github.com/September26/java-algorithms 原题链接:力扣 描述: 你的任务是为一个很受欢迎的银行设计一款

​力扣解法汇总728-自除数-爱代码爱编程

 目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接: 力扣 描述: 自除数 是指可以被它包含的每一位数整除的数。 例如,128 是一个 自除数 ,因为 128 % 1 == 0,128 %

力扣解法汇总1020-飞地的数量-爱代码爱编程

原题链接:力扣 描述: 给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。 一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。 返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。 示例 1: 输入:grid =

leetcode2100. 适合打劫银行的日子(java & python3)-爱代码爱编程

哭了只会做一半 我好笨呜呜呜呜 学习一下动态规划 谢谢题解  java: class Solution { public List<Integer> goodDaysToRobBank(int[] security, int time) { List<Integer> ans = new ArrayLi

【LeetCode每日一题】2100、适合打劫银行的日子(银行办理业务最少的日子)-爱代码爱编程

2100、适合打劫银行的日子 你和一群强盗准备打劫银行。给你一个下标从 0开始的整数数组security,其中security[i]是第 i天执勤警卫的数量。日子从 0开始编号。同时给你一个整数time。 如果第 i天满足以下所有条件,我们称它为一个适合打劫银行的日子: 第 i天前和后都分别至少有 time天。 第 i天前连续 time天警卫数目都是非递

2100适合打劫银行的日子-爱代码爱编程

2100适合打劫银行的日子 问题示例 问题 你和一群强盗准备打劫银行。给你一个下标从 0 开始的整数数组 security ,其中 security[i] 是第 i 天执勤警卫的数量。日子从 0 开始编号。同时给你一个整数 time 。 如果第 i 天满足以下所有条件,我们称它为一个适合打劫银行的日子: 第 i 天前和后都分别至少有 ti

力扣解法汇总393- UTF-8-爱代码爱编程

原题链接:力扣 描述: 给定一个表示数据的整数数组 data ,返回它是否为有效的 UTF-8 编码。 UTF-8 中的一个字符可能的长度为 1 到 4 字节,遵循以下的规则: 对于 1 字节 的字符,字节的第一位设为 0 ,后面 7 位为这个符号的 unicode 码。 对于 n 字节 的字符 (n > 1),第一个字节的前 n 位都设为

力扣解法汇总846-爱代码爱编程

原题链接:力扣 描述: Alice 手中有一把牌,她想要重新排列这些牌,分成若干组,使每一组的牌数都是 groupSize ,并且由 groupSize 张连续的牌组成。 给你一个整数数组 hand 其中 hand[i] 是写在第 i 张牌,和一个整数 groupSize 。如果她可能重新排列这些牌,返回 true ;否则,返回 false 。