20200316:H指数(leetcode274)

题目

在这里插入图片描述

思路与算法

  1. 翻译一下题目意思:给的数组就是每一篇论文的引用次数,至少有h篇文章被引用了h次的意思等价于我们不恰当的假设这个科学家每次发表的文章的引用次数都在下降,出道即巅峰,然后一直衰落,那么第n篇的引用次数至少要比当前的序号大才可以匹配H指数的定义。
  2. 综上:思路为倒序排列(顺便再重温一下排序,使用Arrays类内嵌的方法TimSort方法的原型方法:归并排序方法来重新手写一遍),然后对比序号和实际数值的大小,找到那个引用次数小于序号的,然后减一,即是H指数。

代码实现

class Solution {
    public int hIndex(int[] citations) {
        Merge_Sort(citations);
        int n = 1;
        for (int i = 0;i < citations.length; i++,n++){
            if ( citations[i] < n){
                break;
            }
        }
        return n-1;
    }

	private static void Merge_Sort(int[] arr) {
		int[] temp = new int[arr.length];
		Merge_Sort(arr, 0, arr.length - 1, temp);
	}

	private static void Merge_Sort(int[] arr, int left, int right, int[] tmp) {
		if (left < right) {
			int mid = (left + right) / 2;
			Merge_Sort(arr, left, mid, tmp);
			Merge_Sort(arr, mid + 1, right, tmp);
			Merge(arr, left, mid, right, tmp);
		}
	}

	private static void Merge(int[] arr, int left, int mid, int right, int[] tmp) {
		int i = left;
		int j = mid + 1;
		int k = 0;
		while (i <= mid && j <= right) {
			if (arr[i] >= arr[j]) {
				tmp[k++] = arr[i++];
			} else {
				tmp[k++] = arr[j++];
			}
		}
		while (i <= mid) {
			tmp[k++] = arr[i++];
		}
		while (j <= right) {
			tmp[k++] = arr[j++];
		}
		k = 0;
		while (left <= right) {
			arr[left++] = tmp[k++];
		}
	}
}

复杂度分析

分类Value
时间复杂度O(MNlogN)
空间复杂度O(M)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IMMUNIZE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值