1. Descripción del tema y requisitos
Tema Descripción
Se le proporciona una matriz de números enteros de citas, donde citas[i] representa el número de veces que se ha citado el i-ésimo trabajo del investigador . Calcula y devuelve el índice h del investigador.
De acuerdo con la definición de índice h en Wikipedia: h significa "altas citas" , el índice h de un investigador significa que él (ella) ha publicado al menos h artículos, y cada artículo ha sido citado al menos h veces . Si hay varios valores posibles de h, el índice h es el de mayor valor.
ejemplo
Ejemplo 1:
输入:citations = [3,0,6,1,5]
输出:3
解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。
由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3。
Ejemplo 2:
输入:citations = [1,3,1]
输出:1
pista
n == citations.length
1 <= n <= 5000
0 <= citations[i] <= 1000
2. Ideas para resolver problemas
Idea general:
Primero analice el tema. El tema nos da una matriz de números enteros, y los elementos de la matriz representan el número de veces que se ha citado el artículo correspondiente. Y todo lo que tenemos que hacer es contar que el autor ha publicado al menos h artículos, y estos h artículos deben cumplir la condición de ser citado al menos h veces . Así que todo lo que tenemos que hacer es encontrar esta h, y esta h debe ser la más grande.
Después de analizar el tema, comenzamos a resolver el problema. En primer lugar, cada artículo tiene un número correspondiente de citas, y la matriz dada por el título no está ordenada, por lo que debemos averiguar la cantidad de artículos con características comunes (al menos citadas h veces) , podemos ordenar la matriz completa primero. , Porque no necesitamos saber qué papeles son , podemos clasificarlos directamente. (Si necesita saber qué documentos son, debe usar otros métodos para registrar el número de serie del documento correspondiente). Después de clasificar, podemos ver cuánto h es para un ejemplo específico de un vistazo. Por ejemplo, la matriz = 3,0,6,1,5; el resultado ordenado es 0,1,3,5,6, podemos ver directamente que al menos 3 artículos han sido citados al menos 3 veces . Pero necesitamos que la computadora obtenga este resultado.
Esto es lo que podemos pensar.Después de clasificar, si los artículos anteriores se pueden citar al menos h veces, entonces los artículos detrás de él también deben poder citarse al menos h veces , por lo que necesitamos encontrar el más pequeño en el matriz Tesis sobre las condiciones del tema. Para resumir, podemos recorrer la matriz de grande a pequeño , inicializar h a 0, si el número de referencias > h, h++ e i-- . El recorrido termina cuando se encuentra el último elemento con un recuento de referencia ≥ h . Porque en este momento, el artículo anterior no debe poder cumplir la condición de ser citado al menos h veces. ¿Por qué el número de referencias es > h, porque su > h significa que ha sido referenciado al menos h+1 veces, entonces puede cumplir la condición de ser referenciado al menos h veces ?
Pasos específicos:
①Defina el principio de clasificación función cmp en la función de clasificación qsort como clasificación incremental
② Ordenar la matriz dada
③ Inicializar h e i
④ recorrer la matriz ordenada en orden inverso y actualizar h de acuerdo con la condición y mover i hacia adelante
⑤ volver h
3. Código específico [lenguaje C]
Complejidad de tiempo O(nlogn) Complejidad de espacio O(logn) [gastado principalmente en la clasificación]
int cmp(int *a, int *b) {
return *a - *b;//顺序为递增
}
int hIndex(int* citations, int citationsSize){
//qsort函数包含四个参数,分别是:1.数组名 2.元素个数(从前往后计算)
//3.数组元素所占字节(int,double,char等所占字节) 4.排序原则(递增,递减,奇偶交叉等)
qsort(citations, citationsSize, sizeof(int), cmp);//将数组按照递增的顺序排序
int h = 0, i = citationsSize - 1;//初始化h为0
//从大到小遍历数组,当元素大于h时说明,当前论文至少被引用了h+1次因而将h++
//因为我们是从大到小对数组进行遍历,因而当前面的论文满足引用次数时,后一篇论文也能满足至少被引用的次数
//所以当我们找到小于等于h的元素时循环结束
while (i >= 0 && citations[i] > h) {
h++;
i--;
}
return h;
}