# 2560. House Robber IV ###### tags: `Leetcode` `Medium` `Binary Search` `Greedy` Link: https://leetcode.com/problems/house-robber-iv/description/ ## 思路 思路参考[这里](https://leetcode.com/problems/house-robber-iv/solutions/3143697/java-c-python-binary-search-o-1-space/) “**When we mini-max one capacity to do something, (here is robber k houses) we can use bianry search.**” binary search by value 每一个mid值都是目前假定的min capability 我们要检查在它的基础上能偷多少房子 那么如何检查能偷多少房子呢 这时候就要用到greedy 从前往后扫描 如果当前```num<=mid``` 说明可以偷 那就偷 ```take+=1``` 由于如果偷了当前房子 下一个房子就不能偷了 所以```i++``` 为什么这样能保证偷房子数最多呢 因为假设```nums[0]```和```nums[1]```都小于等于```mid``` 如果偷```nums[0]``` 接下来可以选择的范围是```nums[2:n-1]``` 而如果偷```nums[1]``` 接下来可以选择的范围是```nums[3:n-1]``` 所以显然选前面一个 ## Code ```java= class Solution { public int minCapability(int[] nums, int k) { int left = Integer.MAX_VALUE, right = 0; for(int i=0; i<nums.length; i++){ left = Math.min(left, nums[i]); right = Math.max(right, nums[i]); } while(left<right){ int take = 0; int mid = left+(right-left)/2; for(int i=0; i<nums.length; i++){ if(nums[i]<=mid){ take += 1; i += 1; } } if(take<k) left = mid+1; else right = mid; } return left; } } ```