另类二分--透过枚举得到本质--搜索左边界

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确定答案的方向。

  1. 如果 nums[mid]<nums.length-mid 则答案肯定在mid右边
  2. 如果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;
    }
};

以上是关于另类二分--透过枚举得到本质--搜索左边界的主要内容,如果未能解决你的问题,请参考以下文章

有序数组二分查找模板

[算法模板]二分查找

透过现象看本质:咱也来聊聊CentOS和红帽

二分进阶--在二分外面套一枚举

hdu1540-Tunnel Warfare-(线段树+二分)

AcWing 1945. 奶牛棒球(枚举+二分)