LeetCode刷题日记(2560. 打家劫舍 IV)

'''
沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。
由于相邻的房屋装有相互连通的防盗系统,所以小偷不会窃取相邻的房屋 。
小偷的窃取能力定义为他在窃取过程中能从单间房屋中窃取的最大金额 。
给你一个整数数组 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值