【每日一题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)
相关推荐
YuTaoShao36 分钟前
【LeetCode 热题 100】994. 腐烂的橘子——BFS
java·linux·算法·leetcode·宽度优先
好易学·数据结构9 小时前
可视化图解算法56:岛屿数量
数据结构·算法·leetcode·力扣·回溯·牛客网
墨染点香11 小时前
LeetCode Hot100【5. 最长回文子串】
算法·leetcode·职场和发展
im_AMBER14 小时前
Leetcode 03 java
算法·leetcode·职场和发展
轮到我狗叫了14 小时前
力扣.1312让字符串成为回文串的最少插入次数力扣.105从前序和中序遍历构造二叉树牛客.拼三角力扣.57插入区间编辑
算法·leetcode·职场和发展
科大饭桶18 小时前
数据结构自学Day8: 堆的排序以及TopK问题
数据结构·c++·算法·leetcode·二叉树·c
木子.李34718 小时前
记录Leetcode中的报错问题
算法·leetcode·职场和发展
达文汐18 小时前
【中等】题解力扣22:括号生成
java·算法·leetcode·深度优先
Ylinnnnn1 天前
二分查找法
c++·学习·算法·leetcode·力扣·c·入门
达文汐1 天前
【中等】题解力扣21:合并两个有序链表
java·算法·leetcode·链表