栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

适合打劫银行的日子 java

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

适合打劫银行的日子 java

适合打劫银行的日子

题目描述要求思路

动态规划

题目描述

你和一群强盗准备打劫银行。给你一个下标从 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开始)。返回的日子可以任意顺序排列。 思路 动态规划

首先要确定好要输出的数字的范围使用一个数组存储第i天之前的天数,该天数不增加,使用另一个数组存储第i天之后的天数,该天数不减少其实如果满足左边的一个约束条件下一项就加1,全部满足条件的时候显然得到的这一项要比time大,右边亦然

class Solution {
    public List goodDaysToRobBank(int[] security, int time) {
         // 储存警卫数目的数组
        int n = security.length;
        // 适合打劫的日子的左边,记一个数组
        int[] left = new int[n];
       // 适合打劫的日子的右边,记一个数组
        int[] right = new int[n];
        for (int i = 1; i < n; i++) {
        // 判断一下约束条件
        left[i]=security[i] <= security[i -1]?left[i - 1] + 1:0;
        right[n - i - 1]=security[n - i - 1] <= security[n - i]? right[n - i] + 1:0;
        }
        // 储存一下返回结果
        List ans = new ArrayList<>();
        // 最后判断一下结果
        for (int i = time; i < n - time; i++) {
            if (left[i] >= time && right[i] >= time) {
        // 如果成立就储存一下结果
                ans.add(i);    
            }
        }
        return ans;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/755965.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号