另类二分--透过枚举得到本质--搜索左边界
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了另类二分--透过枚举得到本质--搜索左边界相关的知识,希望对你有一定的参考价值。
题目
题目分析
根据题目描述当引用次数大于等于h的个数正好也是h个,那么这个h就是所谓的h指数,题目需要你找出这个h指数。
- 读完题目,我们会想到从数组元素的个数开始枚举,因为
h
必然是数组元素的个数嘛。 - 但如果盲目枚举元素个数来判断
h
值必然不现实,但是我们发现排序后,如果我们枚举某个数组下标i
,若满足nums[i]>=nums.length-i
,则i
后面所有元素也都满足该式子,而其中nums.length-i
代表元素的个数,这种情况下从左到右扫描正好就能确定 大于等于nums.length-i
的个数有nums.length-i
个,所以这个就是他的h指数
.
那么要如何二分呢?答案很明显可以根据随机选择的mid确定答案的方向。
- 如果
nums[mid]<nums.length-mid
则答案肯定在mid右边。 - 如果
nums[mid]>=nums.length-mid
则答案肯定在mid左边或者正好就是mid处。
很明显如果可以在有序范围区间根据mid确定答案方向,则可二分!!
从左到右扫描
class Solution {
public:
int hIndex(vector<int>& citations) {
int sz = citations.size();
for(int i = 0;i<sz;i++){
if(citations[i]>=sz-i)
return sz-i;
}
return 0;
}
};
二分代码
class Solution {
public:
int hIndex(vector<int>& citations) {
int sz = citations.size();
//左闭右开方式寻找左边界
int l = 0,r = sz;
while(l<r){
int&& mid = l+(r-l)/2;
if(citations[mid]<sz-mid)
l = mid+1;
else{
r = mid;
}
}
return sz-l;
}
};
以上是关于另类二分--透过枚举得到本质--搜索左边界的主要内容,如果未能解决你的问题,请参考以下文章