【每日一题Day363】LC275H 指数Ⅱ | 二分答案

H 指数Ⅱ【LC275】

给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数,citations 已经按照 升序排列 。计算并返回该研究者的 h 指数。

h 指数的定义:h 代表"高引用次数"(high citations),一名科研人员的 h 指数是指他(她)的 (n 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。

请你设计并实现对数时间复杂度的算法解决此问题。

同昨天的二分 区别不用自己排序了

  • 思路

    • 二段性:存在最大值y使,少于等于y的数值一定满足条件;大于y的数值一定不满足条件
    • 二分答案y
      • 引用次数大于等于y的论文数目大于等于y,那么向右搜索获得更大的y
      • 引用次数大于等于y的论文数目小于y,那么向左搜索获得更大的y
    • check:排序后可以快速算出引用次数大于等于y的论文数目
  • 实现

    java 复制代码
    class Solution {
        public int hIndex(int[] citations) {
            
            int n = citations.length;
           // Arrays.sort(citations);
            int l = 1, r = n;
            int res = 0;
            while (l <= r){
                int mid =(l + r) >> 1;
                if (check(citations, mid) >= mid){
                    res = Math.max(res, mid);
                    l = mid + 1;            
                }else{
                     r = mid - 1;
                }
            }
            return res;
        }
        public int check(int[] citations, int target){
            int n = citations.length;
            int l = 0, r = n - 1;
            while (l <= r){
                int mid = l + r >> 1;
                if (citations[mid] < target){
                    l = mid + 1;
                }else{
                    r = mid - 1;
                }
            }
            // l为第一个符合的下标
            return n - l;// 大于等于target的引用次数的数目
    
        }
    }
    • 复杂度
      • 时间复杂度: O ( n l o g m ) O(nlogm) O(nlogm), n n n是数组的长度,m是二分查找的上界。二分查找的时间复杂度是 O ( l o g m ) O(logm) O(logm),每次判断需要的时间复杂度为 O ( n ) O(n) O(n)
      • 空间复杂度: O ( log ⁡ n ) O(\log n) O(logn)
相关推荐
iナナ1 小时前
Java优选算法——二分查找
数据结构·算法·leetcode
Adorable老犀牛4 小时前
阿里云-基于通义灵码实现高效 AI 编码 | 8 | 上手实操:LeetCode学习宝典,通义灵码赋能算法高效突破
学习·算法·leetcode
林木辛4 小时前
LeetCode 热题 160.相交链表(双指针)
算法·leetcode·链表
崎岖Qiu5 小时前
leetcode380:RandomizedSet - O(1)时间插入删除和获取随机元素(数组+哈希表的巧妙结合)
java·数据结构·算法·leetcode·力扣·散列表
好易学·数据结构6 小时前
可视化图解算法60: 矩阵最长递增路径
数据结构·算法·leetcode·力扣·递归·回溯算法·牛客
大锦终6 小时前
【算法】栈专题
数据结构·c++·算法·leetcode
天选之女wow6 小时前
【代码随想录算法训练营——Day6(Day5周日休息)】哈希表——242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和
数据结构·算法·leetcode·散列表
我想吃烤肉肉7 小时前
leetcode-python-2154将找到的值乘以 2
python·算法·leetcode
Mr_Xuhhh15 小时前
项目需求分析(2)
c++·算法·leetcode·log4j
Morri316 小时前
[Java恶补day53] 45. 跳跃游戏Ⅱ
java·算法·leetcode