目录
274. H 指数 H Index 🌟🌟
275. H 指数 II H Index ii 🌟🌟
🌟 每日一练刷题专栏 🌟
Rust每日一练 专栏
Golang每日一练 专栏
Python每日一练 专栏
C/C++每日一练 专栏
Java每日一练 专栏
274. H 指数 H Index
给你一个整数数组 citations
,其中 citations[i]
表示研究者的第 i
篇论文被引用的次数。计算并返回该研究者的 h
指数。
根据维基百科上 h 指数的定义: h 代表“高引用次数”,一名科研人员的 h
指数是指他(她)的 (n
篇论文中)总共有 h
篇论文分别被引用了至少 h
次。且其余的 n - h
篇论文每篇被引用次数 不超过 h
次。
如果 h
有多种可能的值,h
指数 是其中最大的那个。
示例 1:
输入:citations = [3,0,6,1,5] 输出:3 解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。 由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3。
示例 2:
输入:citations = [1,3,1] 输出:1
提示:
n == citations.length
1 <= n <= 5000
0 <= citations[i] <= 1000
代码1:排序
package main
import (
"fmt"
"sort"
)
func hIndex(citations []int) int {
sort.Ints(citations)
n := len(citations)
for i, val := range citations {
if val >= n-i {
return n - i
}
}
return 0
}
func main() {
citations := []int{3, 0, 6, 1, 5}
fmt.Println(hIndex(citations)) // 输出:3
citations = []int{1, 3, 1}
fmt.Println(hIndex(citations)) // 输出:1
}
代码2:计数排序
package main
import "fmt"
func hIndex(citations []int) int {
n := len(citations)
cnt := make([]int, n+1)
for _, val := range citations {
if val < n {
cnt[val]++
} else {
cnt[n]++
}
}
h := 0
for i := n; i >= 0; i-- {
h += cnt[i]
if h >= i {
return i
}
}
return 0
}
func main() {
citations := []int{3, 0, 6, 1, 5}
fmt.Println(hIndex(citations)) // 输出:3
citations = []int{1, 3, 1}
fmt.Println(hIndex(citations)) // 输出:1
}
代码3:二分查找
package main
import "fmt"
func hIndex(citations []int) int {
l, r := 0, len(citations)-1
n := len(citations)
for l <= r {
mid := l + (r-l)/2
cnt := hIndexCount(citations, citations[mid])
if cnt == citations[mid] {
return cnt
} else if cnt < citations[mid] {
r = mid - 1
} else {
if mid+1 == n || hIndexCount(citations, citations[mid+1]) < citations[mid+1] {
return citations[mid]
}
l = mid + 1
}
}
return 0
}
func hIndexCount(nums []int, h int) int {
count := 0
for _, num := range nums {
if num >= h {
count++
}
}
return count
}
func main() {
citations := []int{3, 0, 6, 1, 5}
fmt.Println(hIndex(citations)) // 输出:3
citations = []int{1, 3, 1}
fmt.Println(hIndex(citations)) // 输出:1
}
输出:
3
1
275. H 指数 II H Index 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 <= 10^5
0 <= citations[i] <= 1000
citations
按 升序排列
代码1:二分查找
package main
import "fmt"
func hIndexII(citations []int) int {
n := len(citations)
l, r := 0, n-1
for l <= r {
mid := l + (r-l)/2
if citations[mid] >= n-mid {
r = mid - 1
} else {
l = mid + 1
}
}
return n - l
}
func main() {
citations := []int{0, 1, 3, 5, 6}
fmt.Println(hIndexII(citations)) // 输出:3
citations = []int{1, 2, 100}
fmt.Println(hIndexII(citations)) // 输出:2
}
代码2:线性扫描
package main
import "fmt"
func hIndexII(citations []int) int {
n := len(citations)
h := 0
for i := n - 1; i >= 0 && citations[i] >= n-i; i-- {
h = n - i
}
return h
}
func main() {
citations := []int{0, 1, 3, 5, 6}
fmt.Println(hIndexII(citations)) // 输出:3
citations = []int{1, 2, 100}
fmt.Println(hIndexII(citations)) // 输出:2
}
输出:
3
2
🌟 每日一练刷题专栏 🌟
✨ 持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
🌟 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!
☸ 主页:https://hannyang.blog.csdn.net/
Rust每日一练 专栏(2023.5.16~)更新中... | |
Golang每日一练 专栏(2023.3.11~)更新中... | |
Python每日一练 专栏(2023.2.18~2023.5.18)暂停更 | |
C/C++每日一练 专栏(2023.2.18~2023.5.18)暂停更 | |
Java每日一练 专栏(2023.3.11~2023.5.18)暂停更 |