前言
这篇文章博主会分享自己对于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(logn)。
空间复杂度:O(1)。
设查找范围的初始左边界 l
为 0, 初始右边界 r
为 n - 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 指数 Ⅱ的题目解析,希望文章对大家有帮助,如果文章有什么问题可以在评论区指出,也可以私信博主提出你的意见和建议,欢迎合作交流。