利用二分找出最少窃取的最大金额,假设某次窃取的最大金额为mid=(left+right)/2;
然后利用dp,dp[i]表示窃取的最大金额为mid时窃取前i个房间的最大房间数。
(1)nums[i]>mid: dp[i]=dp[i-1];
(2)nums[i]<=mid时,dp[i]=max(dp[i-1],dp[i-2]+1)
![](https://img-blog.csdnimg.cn/img_convert/ec034f835a7bd34f0bb39128550d93af.png)
class Solution {
public:
int minCapability(vector<int>& nums, int k) {
int right=*max_element(nums.begin(),nums.end());
int left=0;
while(left+1<right)
{
int mid=(left+right)/2;
int x0=0;
int x1=0;
for(int i=0;i<nums.size();i++)
{
if(nums[i]>mid) x0=x1;
else{
int t=x1;
x1=max(x0+1,t);
x0=t;
}
}
if(x1>=k)
{
right=mid;
}
else{
left=mid;
}
}
return right;
}
};