2560. 打家劫舍 IV

2023-09-19 18:33:37

沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。

由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋 。

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

给你一个整数数组 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

题解:这题的本质是找到一个最小的num值使得至少存在k个不相邻的元素它们的最大值是num,由于num值越小那么能找到的k的值越小,num值越大,能找到的k的值越大,因此满足逻辑二分的条件。
二分+贪心,可以贪心地从前往后窃取,若窃取了当前的索引,则跳过下一个索引,不会影响到后序的计数。
当前房屋 nums[i]偷了的话,剩下可以偷的是 nums[i+2] 到 nums[−1],如果当前房屋不偷,就算 nums[i+1]偷了,那么剩下可偷的是 nums[i+3]到 nums[−1],算下来的结果肯定是 <= 的,所以不如直接偷了 nums[i].

有没有可能,二分出来的答案,不在 nums 中呢?
可以把num想象成一根线,将nums中大于它的和小于它的元素分在上下两部分,下半部分的元素个数是k个。如果num不在nums里,可以想象将num这根线慢慢向下移动,只要没有碰到nums中的元素,num下半部分的元素始终是k个。其实就是找的二分法左侧边界,再小就不符合了

code:

class Solution {
    public int minCapability(int[] nums, int k) {
        int lower = Arrays.stream(nums).min().getAsInt();
        int upper = Arrays.stream(nums).max().getAsInt();
        while (lower <= upper) {
            int middle = (lower + upper) / 2;
            int count = 0;
            boolean visited = false;
            for (int x : nums) {
                if (x <= middle && !visited) {
                    count++;
                    visited = true;
                } else {
                    visited = false;
                }
            }
            if (count >= k) {
                upper = middle - 1;
            } else {
                lower = middle + 1;
            }
        }
        return lower;
    }
}


 

更多推荐

chatgpt综述和报告

ChatGPT究竟强在哪?复旦大学邱锡鹏教授《大型语言模型的能力分析与应用》_哔哩哔哩_bilibili2022年底,美国OpenA1公司发布了ChatGPT,一个可以与人类对话交互的千亿规模参数的大型语言模型。它可以根据用户输入的指令完成各种语言相关的任务,例如写文章、写代码、回答问题、日常聊天等等,能够极大地提高人

kubeadm搭建k8s高可用集群(keepalived+nginx+3master)

目录前言服务器准备架构讲解环境初始化安装keepalived软件安装nginx软件初始化k8s节点安装docker初始化master01节点的控制面板master02、master03节点加入集群node01、node02节点加入集群检查集群配置docker和kubectl命令补全创建应用验证集群功能验证master节

Chatgpt介绍及搭建步骤

ChatGPT是一个基于自然语言处理技术的聊天机器人。它使用了深度学习和语义分析技术,可以与用户进行自然、流畅的对话。ChatGPT可以回答各种问题,包括常见问题、娱乐、健康、技术、旅游、金融等领域。ChatGPT的核心技术是GPT(GenerativePre-trainedTransformer),这是一种自然语言处

数据结构——排序算法——基数排序

基数排序有两种实现方式。本例属于最高位优先法,思路是从最高位开始,依次对基数进行排序。与之对应的是「最低位优先法」,思路是从最低位开始,依次对基数进行排序。基数排序可以分为以下三个步骤:1.找到数组中的最大值,确定最大数字的位数2.从最低位开始,对数组进行计数排序。计数排序是稳定排序,所以在每一位排序后,相同数值的元素

排序算法-快速排序

属性快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。.1.快速排序整体的综合性

设计模式:享元模式

目录组件代码实现源码中使用总结享元模式(FlyweightPattern)是一种结构型设计模式,它旨在通过共享对象来最大程度地减少内存使用和提高性能。享元模式通过共享细粒度的对象,以有效地支持大量细粒度的对象实例。在享元模式中,对象分为两种类型:内部状态(IntrinsicState)和外部状态(ExtrinsicSt

ArmSoM-W3之RK3588 Debian11详解

1.简介RK3588从入门到精通Debian是⼀种完全⾃由开放并⼴泛⽤于各种设备的Linux操作系统。Rockchip在官⽅Debian发⾏版的基础上构建和适配了相关硬件功能2.环境介绍硬件环境:ArmSoM-W3RK3588开发板软件版本:OS:ArmSoM-W3Debian113.Debian目录结构debian├

Ae 效果:CC Mr. Mercury

模拟/CCMr.MercurySimulation/CCMr.MercuryCCMr.Mercury(CC水银先生)主要用于创建类似水银等液态金属或油漆等的动态效果。CCMr.Mercury本质上模拟一个发射水银粒子的椭圆形发生器,基于源图像的像素创建自带动画的效果,范围限制在图层大小范围内。◆◆◆效果属性说明Radi

Git学习笔记9

Gitlab中的代码是要部署到生产服务器上。CI:Continuousintegration简称CI:是一种软件开发实践,即开发团队成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化构建(包括编译、发布、自动化测试)来验证,从而尽快地发现集成中的错误。构建:对代

怎样才能让百度搜索到自己的博客?--九五小庞

怎么把自己的博客推荐到百度、Google等主要搜索引擎?如果不把你的博客提交到各大搜索引擎中,它们一般是不会收录你的博客的,你可以先尝试一下看看能不能在百度搜到你的博客吧。如果搜不到的话说明你的博客还没有被百度收录,那么怎么才能被百度、google等各大搜索引擎收录你的博客呢?申请免费加入搜索引擎啦!一般百度在48小时

Vue的详细教程--基础语法【上】

🥳🥳WelcomeHuihui'sCodeWorld!!🥳🥳接下来看看由辉辉所写的关于Vue的相关操作吧目录🥳🥳WelcomeHuihui'sCodeWorld!!🥳🥳一.插值1.文本2.html3.属性&class绑定&style绑定4.表达式二.指令1.v-if&v-else&v-else-if2.

热文推荐