题目:

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

h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (n 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。且其余的 n - h 篇论文每篇被引用次数 不超过 h 次。

提示:如果 h 有多种可能的值,h 指数 是其中最大的那个。

请你设计并实现对数时间复杂度的算法解决此问题。

示例 1:

输入:citations = [0,1,3,5,6]
输出:3
解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 0, 1, 3, 5, 6 次。
  由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3 。
示例 2:

输入:citations = [1,2,100]
输出:2

提示:

  • n == citations.length
  • 1 <= n <= 105
  • 0 <= citations[i] <= 1000
  • citations 按 升序排列

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/h-index-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

【二分查找】

上一个H指数都没明白题目意思,今天再次看到这个题熟悉又陌生,感谢:@【liweiwei1419】https://leetcode.cn/problems/h-index-ii/solution/jian-er-zhi-zhi-er-fen-cha-zhao-by-liweiwei1419-2/,(这个老师的二分查找讲的特别好!强烈推荐)

这里最主要的问题是要理解到:H指数的含义

题目给的含义是:

  • n篇论文中总共有h篇论文分别被引用了至少h次;
  • 其余的n-h篇论文每篇被引用的次数不超过h次。

例如:h = 20,表示引用次数大于等于20 的论文数量最少是20篇。

h指数指的是 论文数量,不是引用次数!!!

进一步理解题意:

一个人的论文被引用的次数有一个分水岭(就是h),如果引用次数大于等于h,就代表高引用的论文。所以需要将所给数组进行分割,条件是:分割线右边的引用次数 >= 分割线右边的论文篇数

又因为引用次数的有序排列的,故想到使用二分查找:

  • left = 0, right = n - 1, mid = left + (right - left) / 2,循环条件是:left < right;
  • 如果nums[mid] < n - mid:表示分割右边的最少引用次数小于右边的论文篇数,说明分割线需要往右移动,下一轮搜索区间应该为[mid+1, right]即left = mid +1
    • 例如[0,2,3,|5,8,10,13,16,20],猜测有6篇论文最小引用次数为6,但是最小引用次数才5,所以分割处需要向右移动,[0,2,3,5,|8,10,13,16,20],猜测有5篇论文最小引用次数为8,其余的4篇论文被引用的次数不超过8次。此时mid就是答案为5。

  • 上面的对立面:如果nums[mid] >= n - mid:表示分割右边的最少引用次数大于等于右边的论文篇数,下一轮搜索区间应该为[left, mid]即right = mid ;
  • 退出循环条件:left == right,返回截止left的论文篇数,需要n - left。
  • right  = n -1:分割线最右只能在n-1的左边。

  • 特殊处理:citations[n-1] == 0,表示如果全部文章的引用次数都为0,则 h 指数就为0。

java代码(left < right):

 1 class Solution {
2 public int hIndex(int[] citations) {
3 int n = citations.length;
4 if (citations[n-1] == 0) return 0;
5 int left = 0, right = n - 1;
6 while (left < right){
7 int mid = left + (right - left) / 2;
8 //如果论文的数量小于中间引用数, 搜索区间往左走
9 //n - mid:分割处右边的论文数量
10 if (citations[mid] < n - mid){
11 left = mid + 1;
12 }else{
13 right = mid;
14 }
15 }
16 return n - left;
17 }
18 }

python3代码(left <= right):

 1 class Solution:
2 def hIndex(self, citations: List[int]) -> int:
3 n = len(citations)
4 left, right = 0, n - 1
5 if citations[n-1] == 0:
6 return 0
7 while left <= right:
8 mid = left + (right - left) // 2
9 if citations[mid] == n - mid:
10 return citations[mid]
11 elif citations[mid] < n - mid:
12 left = mid + 1
13 else:
14 right = mid - 1
15 # [1,3,5,7,10,13] len-left=4
16 return n - left

力扣275(jav&python)-H 指数 II(中等)的更多相关文章

  1. Leetcode之二分法专题-275. H指数 II(H-Index II)

    Leetcode之二分法专题-275. H指数 II(H-Index II) 给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照升序排列.编写一个方法,计算出研究者的 h 指数. ...

  2. Java实现 LeetCode 275 H指数 II

    275. H指数 II 给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照升序排列.编写一个方法,计算出研究者的 h 指数. h 指数的定义: "h 代表"高 ...

  3. 力扣 122 买卖股票的最佳时机II

    力扣 122 买卖股票的最佳时机II 思路: 动态规划,表面上是\(O(2^n)\)的搜索空间,实际上该天的选择只与前一天的状态(是否持有股票)有关.从收益的角度来看,确实每一天的不同选择都会产生不同 ...

  4. [LeetCode] 275. H-Index II H指数 II

    Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimize ...

  5. 275 H-Index II H指数 II

    这是 H指数 进阶问题:如果citations 是升序的会怎样?你可以优化你的算法吗? 详见:https://leetcode.com/problems/h-index-ii/description/ ...

  6. 力扣 ——Remove Duplicates from Sorted List II(删除排序链表中的重复元素 II)python实现

    题目描述: 中文: 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4-> ...

  7. 刷题-力扣-107. 二叉树的层序遍历 II

    107. 二叉树的层序遍历 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-level-order-tr ...

  8. 刷题-力扣-122. 买卖股票的最佳时机 II

    122. 买卖股票的最佳时机 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell ...

  9. [Swift]LeetCode275. H指数 II | H-Index II

    Given an array of citations sorted in ascending order (each citation is a non-negative integer) of a ...

  10. 力扣算法——135Candy【H】

    老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果.相邻的孩子中,评分高 ...

随机推荐

  1. php time 时间 前台拿到 需要*1000能正确显示 dayjs(time*1000).format('YYYY-MM-DD HH:mm:ss')

    php time 时间 前台拿到 需要1000能正确显示 dayjs(time1000).format('YYYY-MM-DD HH:mm:ss')

  2. 突破英语听说要塞-连读与变音 MP3 免费下载

    学英语 连读 弱读,就是这本书最不错了. 网上这个音频 有下载,但是不好找,特此分享,拿走不谢. https://115.com/s/swns19o3359?password=df62&# 突 ...

  3. Android Studio虚拟机文件默认C盘转移其他盘

    原文地址:Android Studio虚拟机文件默认C盘转移其他盘 - Stars-One的杂货小窝 某天发现,新创建的Android13模拟器,把我C盘搞得只剩下9G了,于是折腾了下,把模拟器相关文 ...

  4. Android Swtich开关样式调整

    原文:Android Swtich开关样式调整 - Stars-One的杂货小窝 接入百度人脸的demo时候,发现了内置的switch开关比较好看,看了下实现方法,原来只是改了下样式,记录一下 效果: ...

  5. WPF 模仿微信顶部断网提示气泡

    直接看顶部气泡的效果吧 顶部气泡主要要做三个工作 1.定位到顶部居中 2.气泡需要跟随窗体 3.气泡不可以遮挡住其他程序界面 原生的WPF Poupu控件不会跟随目标移动且在Z轴上会置顶,所以存在打开 ...

  6. RL 基础 | Policy Gradient 的推导

    去听了 hzxu 老师的 DRL 课,感觉终于听懂了,记录一下- 目录 0 我们想做什么 1 三个数学 trick 2 对单个 transition 的 policy gradient 3 对整个 t ...

  7. linux系统centos7.9如何安装nginx

    1.官网下载nginx nginx官网:https://nginx.org/ 选择稳定版进行下载,也可以下载老版本,下载成功后上传到服务器. 2.使用wget下载 访问nginx官网,在下载页面鼠标右 ...

  8. 【非插件实现】wordpress网站页脚添加,网站总访问数/今日访客数

    1 /** 2 * 统计全站总访问量/今日总访问量/当前是第几个访客 3 * @return [type] [description] 4 */ 5 function wb_site_count_us ...

  9. Java开发岗面试题小结

    8种基本数据类型 类型名称 关键字 占用内存 取值范围 字节型 byte 1 字节 -128~127 短整型 short 2 字节 -32768~32767 整型 int 4 字节 -21474836 ...

  10. 讲讲百度地图API遇到的坑,石锤百度官方代码的错,解决SN校验失败

    这两天在做一个项目,用到了百度地图API,根据坐标获取具体位置,总结一下遇到的几个坑 本文基于最新的V3接口,网上好多要么是V2,要么根据地址获取坐标,本文是唯一一个最新的3,根据坐标获取位置的完整说 ...