LeetCode_二分搜索_中等_2560.打家劫舍 IV

目录

1.题目

沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。由于相邻的房屋装有相互连通的防盗系统,所以小偷不会窃取相邻的房屋。

小偷的窃取能力定义为他在窃取过程中能从单间房屋中窃取的最大金额。

给你一个整数数组 nums 表示每间房屋存放的现金金额。形式上,从左起第 i 间房屋中放有 nums[i] 美元。另给你一个整数 k ,表示窃贼将会窃取的最少房屋数。小偷总能窃取至少 k 间房屋。返回小偷的最小窃取能力。

示例 1:

输入:nums = [2,3,5,9], k = 2

输出:5

解释:

小偷窃取至少 2 间房屋,共有 3 种方式:

  • 窃取下标 0 和 2 处的房屋,窃取能力为 max(nums[0], nums[2]) = 5 。
  • 窃取下标 0 和 3 处的房屋,窃取能力为 max(nums[0], nums[3]) = 9 。
  • 窃取下标 1 和 3 处的房屋,窃取能力为 max(nums[1], nums[3]) = 9 。
    因此,返回 min(5, 9, 9) = 5。

示例 2:

输入:nums = [2,7,9,3,1], k = 2

输出:2

解释:共有 7 种窃取方式。窃取能力最小的情况所对应的方式是窃取下标 0 和 4 处的房屋。返回 max(nums[0], nums[4]) = 2 。

提示:

1 <= nums.length <= 10^5^

1 <= nums[i] <= 10^9^

1 <= k <= (nums.length + 1)/2

2.思路

(1)二分搜索

具体思路参考 875.爱吃香蕉的珂珂这篇文章。

相关题目:
LeetCode_动态规划_中等_198.打家劫舍
LeetCode_动态规划_中等_213.打家劫舍 II
LeetCode_动态规划_递归_二叉树_中等_337.打家劫舍 III
LeetCode_二分搜索_中等_875.爱吃香蕉的珂珂
LeetCode_二分搜索_中等_2594.修车的最少时间

3.代码实现(Java)

java 复制代码
//思路1------------二分搜索
class Solution {
    public int minCapability(int[] nums, int k) {
        int left = Arrays.stream(nums).min().getAsInt();
        int right = Arrays.stream(nums).max().getAsInt();
        while (left <= right) {
            int mid = left + (right - left) / 2;
            int cnt = getCnt(nums, mid);
            if (cnt < k) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return left;
    }

    //在最大金额 amount 的限制下,小偷可以偷取的最大房屋数目
    public int getCnt(int[] nums, int amount) {
        int cnt = 0;
        boolean visited = false;
        for (int num : nums) {
            if (num <= amount && !visited) {
                cnt++;
                visited = true;
            } else {
                visited = false;
            }
        }
        return cnt;
    }
}
相关推荐
师太,答应老衲吧1 分钟前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
passer__jw7678 小时前
【LeetCode】【算法】208. 实现 Trie (前缀树)
算法·leetcode
益达爱喝芬达9 小时前
力扣11.3
算法·leetcode
passer__jw7679 小时前
【LeetCode】【算法】406. 根据身高重建队列
算法·leetcode
__AtYou__9 小时前
Golang | Leetcode Golang题解之第535题TinyURL的加密与解密
leetcode·golang·题解
远望樱花兔9 小时前
【d63】【Java】【力扣】141.训练计划III
java·开发语言·leetcode
迃-幵9 小时前
力扣:225 用队列实现栈
android·javascript·leetcode
九圣残炎9 小时前
【从零开始的LeetCode-算法】3254. 长度为 K 的子数组的能量值 I
java·算法·leetcode
vir0211 小时前
找出目标值在数组中的开始和结束位置(二分查找)
数据结构·c++·算法·leetcode
福楠13 小时前
[LeetCode] 1137. 第N个泰波那契数
数据结构·c++·算法·leetcode