• [LeetCode][JavaScript]H-Index II


    H-Index II

    Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimize your algorithm?

    Hint:

    1. Expected runtime complexity is in O(log n) and the input is sorted.

    https://leetcode.com/problems/h-index-ii/

     

     


     

     

    紧接着上一题:http://www.cnblogs.com/Liok3187/p/4782658.html

    给定的数组是升序的,要求时间复杂度为O(logn),二分法。

    h代表“高引用次数”(high citations),一名科研人员的h指数是指他至多有h篇论文分别被引用了至少h次。

    要确定一个人的h指数非常容易,到SCI网站,查出某个人发表的所有SCI论文,让其按被引次数从高到低排列,往下核对,直到某篇论文的序号大于该论文被引次数,那个序号减去1就是h指数。

    还是找拐点,拿上一题的数据举例:[0, 1, 3, 5, 6]

    len - index index citations[index]
    5 0 0
    4 1 1
    3 2 3
    2 3 5
    1 4 6

    index是数组的下标,用数组的长度len减去index得到的就是我们需要的序号,要拿这个序号和对应下标的值作比较。

    如果citations[index] >= len - index,说明结果在数组的前半部分。

    否则citations[index] < len - index,两种情况。

    1.后一篇论文,citations[index + 1] >= len - ( index + 1 ),说明找到了拐点,输出结果。

    2.结果在数组的后半部分。

    最后还要考虑一种特殊情况,比如[5,6,7]。

    做完二分之后找不到结果,因为每篇论文引用的次数都超过了序号,直接输出len就可以了,”h篇论文分别被引用了至少h次“,超过h次还是h。

     2  * @param {number[]} citations
     3  * @return {number}
     4  */
     5 var hIndex = function(citations) {
     6     var len = citations.length;
     7     var start = 0, end = len, index;
     8     while(start <= end){
     9         index = parseInt((start + end) / 2);
    10         if(citations[index] === undefined){
    11             return 0;
    12         }
    13         if(citations[index] >= len - index){
    14             end = index - 1;
    15         }else{
    16             if(citations[index + 1] >= len - index - 1){
    17                 return len - index - 1;
    18             }else{
    19                 start = index + 1;
    20             }
    21         }
    22     }
    23     return len;
    24 };

     

  • 相关阅读:
    站立会议第四天
    站立会议第三天
    站立会议第二天
    站立会议第一天
    团队项目估算
    团队计划会议
    《人月神话》阅读笔记01
    《构建之法》阅读笔记06
    微软买书问题
    找水王2
  • 原文地址:https://www.cnblogs.com/Liok3187/p/4782660.html
Copyright © 2020-2023  润新知