Pregunta diaria de Leetcode: índice 274.H (entrevista clásica de 150 preguntas)

1. Descripción del tema y requisitos

274. Índice H - LeetCode

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;
}

Supongo que te gusta

Origin blog.csdn.net/m0_59800431/article/details/131640139
Recomendado
Clasificación