274. H-Index

https://leetcode.com/problems/h-index/

题解

第一遍没看懂题目。看了中文版的题目才明白,是要找到 h,满足总共有 h 篇论文分别被引用了至少 h 次。

经过观察发现,数组排序后,所谓“至少被引用了 h 次”,就是数组中大于等于 h 的数字的个数,也就是排序数组中 h 位置右边的数字个数。

所以思路是,先对数组排序,排序后,反向下标遍历数组,当下标首次 大于或等于 数组的值时,返回。其中:

  • 等于,则返回 i
  • 大于,则返回 i-1

代码

class Solution {public int hIndex(int[] citations) {Arrays.sort(citations);int len = citations.length;for (int i = 1; i <= len; i++) {if (citations[len - i] == i) return i;else if (citations[len - i] < i) return i - 1;}return len;}
}

275. H-Index II

https://leetcode.com/problems/h-index-ii/

题解

这题和上面的 I 题在定义上没区别,只不过是提前帮你排好序,并且要求你在 logn 时间复杂度下完成。偷懒方法是,直接复制 I 题的代码就可以了。但这不是出题人的目标。

  • 题 I 无法在 O(logn) 时间复杂度下完成,是因为 排序的过程占大头,至少是个 O(n*logn) 。题 I 当然也可以用二分查找来优化,但优化的只是低阶的部分的复杂度,所以二分优化的意义不大。
  • 题 II 直接把 排好序 的数组给你,目的就是为了 考察二分查找

本题中,二分查找的目标,是找到 从前往后数,最后一个“下首次大于上” 的位置。

class Solution {public int hIndex(int[] citations) {int len = citations.length;int lo = 0;int hi = len - 1;int mid = (lo + hi) / 2;while (lo < hi) {if (citations[mid] <= len - mid) lo = mid + 1;else hi = mid;if (citations[lo] > len - lo) break; // 如果已经超出了符合“下首次大于上”条件的边界,及时break,保留了最后一次有效的midmid = (lo + hi) / 2;}if (citations[mid] == len - mid) return len - mid;else if (citations[mid] < len - mid) return len - mid - 1;else return len;}
}

最下面的 10:57 的提交记录,是直接复制 I 题的代码,相当于 O(n) 复杂度,也通过了。

后来才构思了二分查找的方式,边界问题还是挺坑的,调了很长时间。

leetcode 274, 275. H-Index I, II(H 指数问题合集,线性查找/二分查找)相关推荐

  1. LeetCode 1712. 将数组分成三个子数组的方案数(前缀和 + 二分查找)

    文章目录 1. 题目 2. 解题 221 / 3117,前7.1% 574 / 9692,前 5.9% 周赛前2题如下: LeetCode 5641. 卡车上的最大单元数(排序,模拟) LeetCod ...

  2. LeetCode 363. 矩形区域不超过 K 的最大数值和(DP+set二分查找)

    1. 题目 给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和. 示例: 输入: matrix = [[1,0,1],[0,-2,3]], k = 2 输出: ...

  3. 剑指 Offer 53 - II. 0~n-1中缺失的数字(二分查找)

    /*** 剑指 Offer 53 - II. 0-n-1中缺失的数字* @author wsq* @date 2020/10/08一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在 ...

  4. Quartus ii 13.1错误合集,持续更新

    Error (10228): Verilog HDL error at test1.v(1): module "test1" cannot be declared more tha ...

  5. 剑指offer面试题53 - II. 0~n-1中缺失的数字(二分查找)

    题目描述 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字. 思路 详见链接 代码 ...

  6. Leetcode题解 二分查找

    原理 1. 正常实现 public int binarySearch(int[] nums, int key) {int l = 0, h = nums.length - 1;while (l < ...

  7. LeetCode Hot100 ---- 二分查找专题

    什么是二分查找 二分查找是计算机科学中最基本.最有用的算法之一. 它描述了在有序集合中搜索特定值的过程. 二分查找中使用的术语: 目标 Target -- 你要查找的值 索引 Index -- 你要查 ...

  8. 七十六、Python | Leetcode二分查找和分治算法系列

    @Author:Runsen @Date:2020/7/4 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  9. LeetCode 69. x 的平方根(二分查找)

    文章目录 1. 题目 2.解题 2.1 二分查找 2.2 牛顿迭代 1. 题目 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果 ...

最新文章

  1. Java面试题汇总2021最新(集合泛型含答案下载)
  2. 互联网高薪的原因、现状、未来,还值不值得进来?
  3. cad能整体比例缩小吗_CAD中两个缩放的不同及其各自的应用
  4. firefox2.0的拖放式搜索怎么不行了?是设置问题吗?
  5. umi权限路由_Umi 小白纪实(三)—— 震惊!路由竟然如此强大!
  6. 后台设计中容易被忽略的坑
  7. addrinfo 结构
  8. Teamcenter2007 安装步骤
  9. CCF201903-5 317号子任务(100分题解链接)
  10. 批量根据实体类生成相关的类
  11. IT 常用词汇(一)
  12. egret白鹭引擎开发的两个H5小游戏源码分享
  13. 基于DWM1000的UWB测距调试(二)
  14. Kotlin | Kotlin教程
  15. 浅谈IEEE会议论文的不出席政策Non-Presented Paper(No-Show)Policy
  16. python中re模块的span_python3正则模块re的使用方法详解
  17. HDU 6319 Ascending Rating(单调队列)
  18. 因子主成分分析,因子载荷矩阵、因子解释度 因子得分-在基金净值和主要金融因子分析上的应用
  19. 激光SLAM技术总结(3)3D激光SLAM算法原理
  20. 解决使用Keil5不能生成bin文件或生成的是.bin文件夹问题

热门文章

  1. HYSBZ - 3676 回文串(回文自动机)
  2. android 点击item跳转页面,Android RecyclerView Item 点击事件,简单
  3. jdbc oracle存储过程,java jdbc 执行oracle存储过程
  4. HTML5的Canvas画图模拟太阳系运转
  5. 限制排列与棋盘多项式
  6. HDU4267(2012长春网络赛)
  7. deque与vector的主要区别
  8. 换种思路去理解设计模式
  9. ucontext族函数的使用及原理分析
  10. MySQL中B-tree索引和Hash索引区别