Leetcode 275.H 指数 Ⅱ -LeetCode

前言

这篇文章博主会分享自己对于275题的一些理解与题目解析,博主在自己的每日一题中看见了这道题目,觉得这个题目有点意思于是准备写这篇题解。希望对大家有帮助。


以下是本篇文章具体内容,仅供参考

一、题目描述与分析

题目链接: Leetcode 275.H 指数 Ⅱ -LeetCode

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

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

题目分析:
题目定义了一个概念叫 h指数,那这个概念是什么意思呢?

  • h指数就是给定数组的元素满足一个条件:后n篇论文如果满足 citations[i - n] >= n 这个条件的话,那么这个n就是 h指数
    题目给了我们一个升序排序的整数数组,如果学过二分查找的同学呢就可以想到二分查找的思想,因为这里本身给了一个有序的数组。

二、题解以及代码

博主对于题目的分析以及解决方法
1、二分查找
二分查找的时间复杂度为 O(log⁡n)。
空间复杂度:O(1)。

设查找范围的初始左边界 l 为 0, 初始右边界 rn - 1,其中 n 为数组 citations 的长度。每次在查找范围内取中点 mid,则有 n − mid 篇论文被引用了至少 citations[mid] 次,因为数组是升序的。如果在查找过程中满足 citations[mid] ≥ n − mid,则移动右边界 right,否则移动左边界 left

int hIndex(int* citations, int citationsSize){
    int l = 0,r = citationsSize - 1, mid;
    while(l <= r){
        mid = l + (r - l)/2;
        if(citations[mid] >= citationsSize - mid){
            r = mid - 1;
        }else{
            l = mid + 1;
        }
    }
    return citationsSize - l;
}
class Solution {
    public int hIndex(int[] citations) {
        int l = 0,r = citations.length - 1,n = citations.length;
        while(l <= r){
            int mid = l + (r - l)/2;
            if(citations[mid] >= n - mid){
                r = mid - 1;
            }else{
                l = mid + 1;
            }
        }
        return n - l;
    }
}

2、线性查找
遍历数组找到最先满足citations[i] >= n - i的元素,那么这个元素就是 h指数 的起始元素。

int hIndex(int* citations, int citationsSize){
    for(int i = 0;i < citationsSize;i++){
        if(citations[i] >= citationsSize - i)return citationsSize - i;
    }
    return 0;
}
class Solution {
    public int hIndex(int[] citations) {
        int len = citations.length;
        for(int i = 0;i < citations.length;i++){
            if(citations[i] >= len - i) return len - i;
        }
        return 0;
    }
}

时间复杂度:O(n);
空间复杂度:O(1);


总结

本篇文章为大家提供了Leetcode 275.H 指数 Ⅱ的题目解析,希望文章对大家有帮助,如果文章有什么问题可以在评论区指出,也可以私信博主提出你的意见和建议,欢迎合作交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值