'''
沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。
由于相邻的房屋装有相互连通的防盗系统,所以小偷不会窃取相邻的房屋 。
小偷的窃取能力定义为他在窃取过程中能从单间房屋中窃取的最大金额 。
给你一个整数数组 nums 表示每间房屋存放的现金金额。形式上,从左起第 i 间房屋中放有 nums[i] 美元。
另给你一个整数 k ,表示窃贼将会窃取的最少房屋数。小偷总能窃取至少 k 间房屋。
返回小偷的最小窃取能力。
'''
from typing import List
class Solution:
def minCapability(self, nums: List[int], k: int) -> int:
# 找到nums列表中的最小值和最大值
lower = min(nums)
upper = max(nums)
# 使用二分查找来寻找最小的能力值
while lower <= upper:
middle = (lower + upper) // 2
# 初始化计数和visited变量
count = 0
visited = False
# 遍历nums列表
for x in nums:
# 检查x是否小于等于middle,以及是否已经访问过
if x <= middle and not visited:
# 增加计数并标记为已访问
count += 1
visited = True
else:
# 如果x大于middle,重置visited状态
visited = False
# 如果满足最大值小于等于middle的子数组数量大于等于k
if count >= k:
# 更新上界,以搜索更小的能力值
upper = middle - 1
else:
# 更新下界,以搜索更大的能力值
lower = middle + 1
# 返回下界,它表示最小的能力值
return lower
LeetCode刷题日记(2560. 打家劫舍 IV)
最新推荐文章于 2024-07-15 22:53:16 发布