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 <= 105

1 <= nums[i] <= 109

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;
    }
}
相关推荐
IronMurphy7 小时前
【算法二十六】108. 将有序数组转换为二叉搜索树 98. 验证二叉搜索树
数据结构·算法·leetcode
im_AMBER7 小时前
Leetcode 141 最长公共前缀 | 罗马数字转整数
算法·leetcode
WolfGang0073218 小时前
代码随想录算法训练营 Day13 | 二叉树 part03
数据结构·算法·leetcode
一叶落4389 小时前
167. 两数之和 II - 输入有序数组【C语言题解】
c语言·数据结构·算法·leetcode
一叶落43810 小时前
LeetCode 54. 螺旋矩阵(C语言详解)——模拟 + 四边界收缩
java·c语言·数据结构·算法·leetcode·矩阵
Storynone10 小时前
【Day27】LeetCode:56. 合并区间,738. 单调递增的数字
python·算法·leetcode
计算机安禾11 小时前
【C语言程序设计】第31篇:指针与函数
c语言·开发语言·数据结构·c++·算法·leetcode·visual studio
Frostnova丶11 小时前
LeetCode 3070. 元素和小于等于 k 的子矩阵数目
算法·leetcode·矩阵
不想看见40412 小时前
Implement Queue using Stacks栈和队列--力扣101算法题解笔记
笔记·算法·leetcode
MrZhangBaby12 小时前
SQL-leetcode—3482. 分析组织层级
数据库·sql·leetcode