目录
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 mainimport ("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)) // 输出:3citations = []int{1, 3, 1}fmt.Println(hIndex(citations)) // 输出:1
}
代码2:计数排序
package mainimport "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 := 0for 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)) // 输出:3citations = []int{1, 3, 1}fmt.Println(hIndex(citations)) // 输出:1
}
代码3:二分查找
package mainimport "fmt"func hIndex(citations []int) int {l, r := 0, len(citations)-1n := len(citations)for l <= r {mid := l + (r-l)/2cnt := 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 := 0for _, num := range nums {if num >= h {count++}}return count
}func main() {citations := []int{3, 0, 6, 1, 5}fmt.Println(hIndex(citations)) // 输出:3citations = []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 mainimport "fmt"func hIndexII(citations []int) int {n := len(citations)l, r := 0, n-1for l <= r {mid := l + (r-l)/2if 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)) // 输出:3citations = []int{1, 2, 100}fmt.Println(hIndexII(citations)) // 输出:2
}
代码2:线性扫描
package mainimport "fmt"func hIndexII(citations []int) int {n := len(citations)h := 0for 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)) // 输出:3citations = []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)暂停更 |