每日算法练习:LeetCode 274. H 指数 ✅
大家好我是你们的算法小伙伴。今天我们来练习一道排序与计数的经典题目 ——LeetCode 274. H 指数。这道题考察对定义的理解和高效统计的思路是面试中常见的基础题。题目描述给你一个整数数组citations其中citations[i]表示研究者的第i篇论文被引用的次数。计算并返回该研究者的h 指数。根据维基百科上 h 指数的定义h 代表 “高引用次数”一名科研人员的 h 指数是指他她至少发表了 h 篇论文并且至少有 h 篇论文被引用次数大于等于 h。如果 h 有多种可能的值h 指数是其中最大的那个。示例 1输入citations [3,0,6,1,5] 输出3 解释研究者共有 5 篇论文被引次数分别为 3, 0, 6, 1, 5。 其中有 3 篇论文被引至少 3 次其余 2 篇被引不多于 3 次所以 h 指数是 3。示例 2输入citations [1,3,1] 输出1提示n citations.length1 n 50000 citations[i] 1000解题思路核心定义拆解h 指数要满足两个条件至少有h篇论文每篇被引用次数 ≥hh是满足条件的最大值方法一排序法直观易理解思路将数组降序排序然后遍历找到最大的h使得第h篇论文的引用数 ≥h。排序后前h篇论文是被引次数最高的h篇只要第h篇索引h-1的引用数 ≥h就满足条件方法二计数排序法时间更优O (n)思路利用引用次数的范围0~1000统计每个引用次数出现的次数然后从后往前累加找到最大的h。建立一个计数数组cntcnt[i]表示被引次数为i的论文数从后往前遍历cnt累加论文总数当总数 ≥ 当前i时i就是 h 指数代码实现方法一排序法class Solution { public int hIndex(int[] citations) { // 升序排序 Arrays.sort(citations); int n citations.length; // 从后往前找最大的 h for (int h n; h 1; h--) { // 第 n-h 篇是第 h 篇高引论文 if (citations[n - h] h) { return h; } } return 0; } }方法二计数排序法class Solution { public int hIndex(int[] citations) { int n citations.length; int[] cnt new int[1001]; // 引用次数范围 0~1000 // 统计每个引用次数的论文数 for (int c : citations) { cnt[c]; } // 从后往前累加找最大 h int total 0; for (int h 1000; h 0; h--) { total cnt[h]; if (total h) { return h; } } return 0; } }代码详解一、排序法Arrays.sort(citations)将数组升序排序方便从后往前取高引论文。for (int h n; h 1; h--)从最大可能的 h论文总数开始往下试。citations[n - h] hn-h是升序数组中第h篇高引论文的索引如果这篇论文的引用数 ≥h就满足 h 指数定义直接返回h示例 1 模拟[3,0,6,1,5]排序后 →[0,1,3,5,6]h5citations[0] 0 5→ 不满足h4citations[1] 1 4→ 不满足h3citations[2] 3 ≥ 3→ 满足返回 3二、计数排序法示例 1citations [3,0,6,1,5]第一步先统计 cnt 数组被引次数→论文数cnt[0] 1有 1 篇论文被引 0 次cnt[1] 1有 1 篇论文被引 1 次cnt[3] 1有 1 篇论文被引 3 次cnt[5] 1有 1 篇论文被引 5 次cnt[6] 1有 1 篇论文被引 6 次其他 cnt [2], cnt [4], cnt [7]...cnt [1000] 都为 0第二步从 h1000 往下遍历看 total 和 h 的关系当前 h 值cnt[h]total累计论文数total ≥ h说明100000000 ≥ 1000×不满足99900000 ≥ 999×不满足...中间所有 h6 的值cnt [h] 都是 0total 一直为 0............610111 ≥ 6×累计 1 篇被引≥6 的论文不够 6 篇511122 ≥ 5×累计 2 篇被引≥5 的论文5、6不够 5 篇402022 ≥ 4×累计还是 2 篇5、6不够 4 篇312133 ≥ 3√累计 3 篇被引≥3 的论文3、5、6满足此时触发return h返回 3和示例结果一致。复杂度分析解法时间复杂度空间复杂度优点排序法O(n log n)O (1)原地排序代码简洁易理解适合面试快速写出计数排序法O(n)O (1)固定大小数组时间最优适合大数据量总结h 指数的核心找到最大的h使得至少h篇论文被引 ≥h次。排序法是最直观的解法面试中优先选择代码易写且不易出错。计数排序法利用了题目中引用次数的范围限制实现了 O (n) 的最优时间复杂度。今天的每日算法练习就到这里我们明天再见
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2429010.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!