力扣275(jav&python)-H 指数 II(中等)
题目:
给你一个整数数组 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(中等)的更多相关文章
- Leetcode之二分法专题-275. H指数 II(H-Index II)
Leetcode之二分法专题-275. H指数 II(H-Index II) 给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照升序排列.编写一个方法,计算出研究者的 h 指数. ...
- Java实现 LeetCode 275 H指数 II
275. H指数 II 给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照升序排列.编写一个方法,计算出研究者的 h 指数. h 指数的定义: "h 代表"高 ...
- 力扣 122 买卖股票的最佳时机II
力扣 122 买卖股票的最佳时机II 思路: 动态规划,表面上是\(O(2^n)\)的搜索空间,实际上该天的选择只与前一天的状态(是否持有股票)有关.从收益的角度来看,确实每一天的不同选择都会产生不同 ...
- [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 ...
- 275 H-Index II H指数 II
这是 H指数 进阶问题:如果citations 是升序的会怎样?你可以优化你的算法吗? 详见:https://leetcode.com/problems/h-index-ii/description/ ...
- 力扣 ——Remove Duplicates from Sorted List II(删除排序链表中的重复元素 II)python实现
题目描述: 中文: 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4-> ...
- 刷题-力扣-107. 二叉树的层序遍历 II
107. 二叉树的层序遍历 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-level-order-tr ...
- 刷题-力扣-122. 买卖股票的最佳时机 II
122. 买卖股票的最佳时机 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell ...
- [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 ...
- 力扣算法——135Candy【H】
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果.相邻的孩子中,评分高 ...
随机推荐
- 1.JAVA中的几种基本数据类型是什么,各自占用多少字节
1.JAVA中的几种基本数据类型是什么,各自占用多少字节 基本类型 大小 最小值 最大值 默认值 byte(位) 8bits = 1字节 -128 127 0 short(短整数) 16bit = 2 ...
- java中float内存存储原理
规格化表示: 浮点数采用的是IEEE Standard 754 Floating Point Numbers标准 float占用4个字节,和int一样,也是32bit. 第1个bit表示符号,0表示正 ...
- XMLSpringEclipseWebCache
XMLSpringEclipseWebCache XMLSpy编辑工具中如何设置XML的DTD/XSD校验指向本地,而不要直接指向网络去? 前提:在不修改XML的条件下,修改XML的,不要这个,这个变 ...
- C++中fopen的句柄返回NULL
我们在使用fopen打开文件的时候有时会出现失败返回null情况,但是我们不能直接通过log具体是什么原因导致的,所以这时我们可以通过errno和strerror获取错误码和错误信息. 我遇到的是错误 ...
- Java 学习分享
建议语言入门可以先看看视频,学习网站可以是github,极客时间,infoQ等,然后去看书深入研究学习.学习最有效的方式一定是自己动手写代码,而不是看别人的代码,自己下载Intelli Idea多敲敲 ...
- 云VR给当今的教育行业带来哪些契机
教育一直是国之根本大策,培养下一代高科技新型人才是新时代规划的重要建设目标.教育的授课方式也别出心裁,不断地涌现出教育的新模式.3DCAT 云VR别出心裁,为教育行业带来新的教学方式和简化管理的全新系 ...
- 【Leetcode】53. 最大子数组和
题目(链接) 给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 子数组是数组中的一个连续部分. 示例 1: 输入:nums = [-2,1,-3, ...
- QGIS中下载遥感影像的Python代码片段
1. 引言 QGIS是开源免费且好用的GIS软件,并且可以使用Python脚本来控制 这里主要使用的打开QGIS时启动内置的Python解释器,这个Python解释器可以访问iface接口从而实现对Q ...
- 「AntV」Vue3与TS框架下使用L7
1. 引言 Vue是常用的前端框架,TypeScript(简称TS) 是 JavaScript 的超集,可以提高代码的可维护性和可读性 本文基于Vite.Vue3和TypeScript搭建L7开发环境 ...
- 记录--优雅解决uniapp微信小程序右上角胶囊菜单覆盖问题
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 大家好,今天聊一下在做uniapp多端适配项目,需要用到自定义导航时,如何解决状态栏塌陷及导航栏安全区域多端适配问题,下文只针对H5 ...