当前位置: 首页 > news >正文

【每日一题Day331】LC2560打家劫舍 IV | 二分查找 + 贪心

打家劫舍 IV【LC2560】

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

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

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

给你一个整数数组 nums 表示每间房屋存放的现金金额。形式上,从左起第 i 间房屋中放有 nums[i] 美元。

另给你一个整数 k ,表示窃贼将会窃取的 最少 房屋数。小偷总能窃取至少 k 间房屋。

返回小偷的 最小 窃取能力。

  • 思路:最小化最大值->二分查找

    • 明确题意:求取至少偷k不相邻的房屋时,小偷的 最小 窃取能力,即最小化偷取房屋金额的最大值。
    • 寻找单调性(二段性):偷取能力 y y y增加(能偷取的房屋的金额必须小于等于 y y y),能偷取不相邻房屋数目增加,因此一定存在一个分割点 y y y,使得
      • 小于y的值,能够偷取的房屋数目 c o u n t count count必然不满足 c o u n t ≥ k count \ge k countk
      • 大于等于y的值,能够偷取的房屋数目 c o u n t count count必然满足 t o t a l ≥ k total \ge k totalk
    • 二分答案:因此当偷取房屋数目至少为 k k k时,寻找最大偷取数目的最小值 y y y,可以通过二分查找的方法找到最终的 y y y,二分查找的下限为min(nums),上限为max(nums)
    • check函数:
      • 统计最大偷取数目为 y y y时,能够偷取的房屋数目,是否大于 k k k,大于则返回true
      • 由于不能偷取相邻房屋,因此需要记录上一个偷取的房屋编号
  • 实现

    class Solution {public int minCapability(int[] nums, int k) {int n = nums.length;int l = Integer.MIN_VALUE, r = 0;for (int num : nums){r = Math.max(r, num);l = Math.min(l, num);            }while (l <= r){int mid = (l + r) / 2;if (check(nums, mid, k)){r = mid - 1;}else{l = mid + 1;}}return l;}public boolean check(int[] nums, int target, int k){int n = nums.length;int j = -2;int count = 0;for (int i = 0; i < n; i++){if (j + 2 <= i && nums[i] <= target){count++;j = i;if (count >= k) return true;}     }return false;}}
    
    • 复杂度
      • 时间复杂度: O ( n log ⁡ C ) O(n\log C) O(nlogC) n n n是数组的长度,C是二分的范围,即数组中最最大和最小值的差值。二分查找的时间复杂度是 O ( log ⁡ C ) O(\log C) O(logC),每次二分查找需要判断是否符合条件的时间复杂度为 O ( n ) O(n) O(n),因此总的时间复杂度为 O ( n l o g ( n c ) ) O(nlog(nc)) O(nlog(nc))
      • 空间复杂度: O ( 1 ) O(1) O(1)
http://www.lryc.cn/news/172911.html

相关文章:

  • JVM 参数详解
  • uni-app获取地理位置
  • Learn Prompt-Prompt 高级技巧:思维链 Chain of Thought Prompting
  • Vim编辑器使用入门
  • 早餐与风景
  • 常用python代码串
  • 电脑桌面透明便签软件是哪个?
  • Git创建干净分支,本地操作不依赖任何分支
  • sqlmap tamper脚本编写
  • 5.5V-65V Vin同步降压控制器,具有线路前馈SCT82630DHKR
  • YOLOv5、YOLOv8改进:Decoupled Head解耦头
  • Prometheus+Grafana可视化监控【Redis状态】
  • 怒刷LeetCode的第6天(Java版)
  • SSL双向认证-Nginx配置
  • GO学习之 远程过程调用(RPC)
  • 八大排序(四)--------直接插入排序
  • MYSQL--存储引擎和日志管理
  • VUE之更换背景颜色
  • 大型集团借力泛微搭建语言汇率时区统一、业务协同的国际化OA系统
  • Quartz 建表语句SQL文件
  • nginx SseEmitter 长连接
  • 若依cloud -【 100 ~ 】
  • VPN协议是如何工作的
  • c++::作用域符解析
  • 【电源专题】什么是充电芯片的Shipping Mode(船运模式)
  • WebGL笔记: 2D和WebGL坐标系对比和不同的画图方式, 程序对象通信,顶点着色器,片元着色器
  • 【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
  • 多模块和分布式项目
  • AI视频剪辑:批量智剪技巧大揭秘
  • vue项目实现地址自动识别功能