二分法,对具体的数值而不是数组下标,因为找的是金额,判断数组中能偷的并且数组最大值<= mid的个数是否>= k
class Solution {
public int minCapability(int[] nums, int k) {
//二分法找最大的最小值和最小的最大值
//首先找到数组中最大的值作为右边界,这里二分法是对具体的值还不是数组下标
//判断mid对应的值假设就是当前房屋小于等于这个mid,并且第一个选中,第二不选中的个数
//如果个数小于等于k,说明值小了left = mid + 1
//否则right = mid
int left = 0,right = 0,mid,result = 0;
for(int i = 0; i < nums.length; i++)
right = Math.max(nums[i],right );
while (left <= right){
mid = (left + right) / 2;
if (isValid(nums,mid,k)){
result = mid;
right = mid - 1;
}
else
left = mid + 1;
}
return result;
}
//获取最大个数,所以第一个肯定得偷
private boolean isValid(int[] nums, int mid, int k) {
int count = 0;
boolean canSteal = true;
for(int i = 0; i < nums.length; i++){
if (nums[i] <= mid && canSteal){
count++;
canSteal = false;
}
//当前不能偷,那下一个一定可以偷
else
canSteal = true;
}
return count >= k;
}
}