网站引导图,建设农业网站的论文,wordpress ip 黑名单,wordpress 百度ping目录
题目#xff1a;
示例#xff1a;
分析#xff1a;
代码#xff1a; 题目#xff1a; 示例#xff1a; 分析#xff1a;
题目翻译有些烂#xff0c;我来二次翻译一下#xff0c;找出数组中k个两两互不相邻的数#xff0c;求出它们的最大值。要求最大值尽可…目录
题目
示例
分析
代码 题目 示例 分析
题目翻译有些烂我来二次翻译一下找出数组中k个两两互不相邻的数求出它们的最大值。要求最大值尽可能小。
我们换个看法来解题实际上我们要找出一个数在数组中小于等于这个数并且两两不相邻的元素需要大于等于k。
这下子就让我想到了九月七号的每日一题修车的最少时间和LeetCode75的第五十六题爱吃香蕉的珂珂可以使用二分查找来解题。
我们用二分查找首先需要确认左右范围我们要找的数是数组中长度为k的子数组的最大值所以范围就是整个数组的最小值和最大值我们一次遍历就可以获取用api调用获取也可以。
接着就是判断缩小范围的条件。
我们去数组中寻找数组中符合要求的小于等于范围中位数的数有几个。如果数量大于等于k那么缩小右范围反之缩小左范围直到范围缩小到一个数那么这个数就是我们要求的答案。
寻找的话我们可以直接遍历整个数组遇到不比范围中位数大的数我们就记录下来然后把用于遍历的下标再加个1表示不取相邻的元素。
具体可以参考代码。
代码
class Solution {
public://查看数组中是否有不相邻的k个小于等于窃取能力的房屋bool check(vectorintnums,int k,int mid){int n0;for(int i0;inums.size();i){if(nums[i]mid){n;i;//因为需要不相邻,所以i多一次}}return nk;}int minCapability(vectorint nums, int k) {int lINT_MAX,rINT_MIN;//获取最小值和最大值来作为二分查找的左右边界for(int num:nums){lmin(l,num);rmax(r,num);}while(lr){int midl(r-l)/2;if(check(nums,k,mid)) rmid;else lmid1;}return l;}
};