LeetCode 2100:银行抢劫吉日算法部分测试用例失败排查
题目描述
你和一伙盗贼计划抢劫银行。给定一个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索引)列表,返回顺序无关。
问题重现
你编写的代码在测试用例:
security = [1,2,5,4,1,0,2,4,5,3,1,2,4,3,2,4,8] time = 2
时,输出为[4,5,6,10,14],但预期输出是[5,10,14]。
错误分析
你的核心思路是对的,但在前缀数组的判断逻辑上出现了两处关键错误:
1. 左侧条件判断错误
你定义的left[i]表示以第i天结尾的连续非递增天数(包含i本身),要满足“第i天之前time天内非递增”,本质是要求从i-time到i的time+1天连续非递增,也就是left[i] >= time + 1。但你代码中用的是left[i-1] >= time,这个逻辑完全不匹配需求,会错误把部分不符合的天数纳入结果。
2. 右侧条件判断错误
同理,right[i]表示以第i天开头的连续非递减天数(包含i本身),要满足“第i天之后time天内非递减”,需要right[i] >= time + 1(覆盖i到i+time的time+1天)。但你代码中用的是right[i+1] >= time,这会忽略i本身和i+1的大小关系,导致像i=4这种security[4] > security[5]的情况被误判为符合条件。
3. 多余的模式存在判断
你代码中的l_pattern_found和r_pattern_found属于冗余逻辑,后续的筛选步骤会自动过滤掉不符合条件的天数,不需要提前返回空列表。
修正后的代码
class Solution(object): def goodDaysToRobBank(self, security, time): """ :type security: List[int] :type time: int :rtype: List[int] """ total_guards = len(security) if time == 0: return [i for i in range(total_guards)] left = [1] * total_guards for i in range(1, total_guards): if security[i-1] >= security[i]: left[i] = left[i-1] + 1 right = [1] * total_guards for i in range(total_guards-2, -1, -1): if security[i] <= security[i+1]: right[i] = right[i+1] + 1 days = [] for i in range(time, total_guards - time): if left[i] >= time + 1 and right[i] >= time + 1: days.append(i) return days
验证结果
修正后的代码针对上述测试用例,会正确计算left和right数组,筛选出i=5、10、14三个符合条件的吉日,与预期输出一致。
内容的提问来源于stack exchange,提问作者Suhail Gupta

