

这一题的大意是给出一个数组,可以从中选取k个不相邻的元素,现在,我们希望这k个元素的最大值最小。
看到最大值最小,果断二分答案。
现在关键就是在check函数中假设这个最大值为x,判断这个x是不算符合最大值即可。
那么如何判断呢?
我们只需要在数组中找到大于等于k个的不相邻的元素,使得它们的值小于等于x即可。
这样就说明在最大值为x的情况下存在符合条件。
cpp
class Solution {
public:
bool check(int x,vector<int>& nums,int k)
{
int i=0;
int cnt=0;;
while(i<nums.size())
{
if(nums[i]<=x)
{
cnt++;
i+=2;
}
else
{
i++;
}
}
if(cnt>=k)
{
return true;
}
else{
return false;
}
}
int minCapability(vector<int>& nums, int k) {
//最少能偷窃k间房屋
int l=1;
int r=1e9;
int ans=INT_MAX;
while(l<=r)
{
int mid=(l+r)/2;
if(check(mid,nums,k))
{
ans=min(ans,mid);
r=mid-1;
}
else
{
l=mid+1;
}
}
return ans;
}
};
感觉二分答案实际上就是一种逆向思维,假设答案存在,去验证结果。
时间复杂度O(nlogn)