Golang每日一练(leetDay0094) H 指数 I\II H Index

简介: Golang每日一练(leetDay0094) H 指数 I\II H Index

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)暂停更


目录
相关文章
|
8月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
579 0
|
机器学习/深度学习 数据采集 算法
时间序列结构变化分析:Python实现时间序列变化点检测
在时间序列分析和预测中,准确检测结构变化至关重要。新出现的分布模式往往会导致历史数据失去代表性,进而影响基于这些数据训练的模型的有效性。
1981 1
|
存储 Python
Python 实现单向链表,和单向链表的反转
链表是一种数据结构,每个节点存储相邻节点的位置信息。单链表中的节点仅存储下一节点的位置。通过Python实现单链表,定义`ListNode`类并关联节点可创建链表。例如,创建A-&gt;B-&gt;C的链表后,可通过反转函数`reverse`将链表反转为CBA。代码展示了如何实现和操作单链表。
355 6
Python 实现单向链表,和单向链表的反转
|
存储 Python
Python 中链表的个人理解
简介:本文介绍了Python中链表的基本组成及其操作实现。链表由`head`(头节点)、中间节点和`tail`(尾节点)三部分构成,每个节点通过`Node`类定义,包含`value`(值域)和`next`(指针域)。示例代码展示了链表的增删查功能,包括`add`(头部插入)、`append`(尾部插入)、`remove`(删除节点)、`search`(查找节点)及遍历方法。运行结果验证了链表操作的正确性。
|
存储 索引 Python
Python入门:6.深入解析Python中的序列
在 Python 中,**序列**是一种有序的数据结构,广泛应用于数据存储、操作和处理。序列的一个显著特点是支持通过**索引**访问数据。常见的序列类型包括字符串(`str`)、列表(`list`)和元组(`tuple`)。这些序列各有特点,既可以存储简单的字符,也可以存储复杂的对象。 为了帮助初学者掌握 Python 中的序列操作,本文将围绕**字符串**、**列表**和**元组**这三种序列类型,详细介绍其定义、常用方法和具体示例。
Python入门:6.深入解析Python中的序列
|
存储 数据采集 大数据
Python推导式进阶指南:优雅初始化序列的科学与艺术
本文系统讲解Python推导式的用法与技巧,涵盖列表、字典、集合推导式及生成器表达式。通过代码示例和性能对比,展示推导式在数据结构初始化中的优势:简洁高效、执行速度快30%-50%。文章分析基础语法、核心应用场景(如序列构造、键值对转换、去重运算)及嵌套使用,并探讨使用边界与最佳实践,强调可读性优先原则。最后指出,合理运用推导式能显著提升代码质量和处理效率,同时避免过度复杂化的陷阱。
395 0
|
数据挖掘 数据处理 开发者
Python3 自定义排序详解:方法与示例
Python的排序功能强大且灵活,主要通过`sorted()`函数和列表的`sort()`方法实现。两者均支持`key`参数自定义排序规则。本文详细介绍了基础排序、按字符串长度或元组元素排序、降序排序、多条件排序及使用`lambda`表达式和`functools.cmp_to_key`进行复杂排序。通过示例展示了如何对简单数据类型、字典、类对象及复杂数据结构(如列车信息)进行排序。掌握这些技巧可以显著提升数据处理能力,为编程提供更强大的支持。
931 10
|
机器学习/深度学习 索引 Python
python之序列
python之序列
334 59
|
存储 算法 搜索推荐
Python 实现反转、合并链表有啥用?
大家好,我是V哥。本文介绍Python实现反转链表和合并链表的应用场景及代码实现。反转链表适用于时间序列数据展示、回文链表判断等;合并链表则用于大规模数据排序、数据库查询结果集合并等。通过迭代和递归方法实现反转链表,以及合并两个或多个有序链表的算法,帮助开发者解决实际问题。关注V哥,了解更多实用编程技巧。 先赞再看后评论,腰缠万贯财进门。
322 0
|
搜索推荐 Python
快速排序的 Python 实践:从原理到优化,打造你的排序利器!
本文介绍了 Python 中的快速排序算法,从基本原理、实现代码到优化方法进行了详细探讨。快速排序采用分治策略,通过选择基准元素将数组分为两部分,递归排序。文章还对比了快速排序与冒泡排序的性能,展示了优化前后快速排序的差异。通过这些分析,帮助读者理解快速排序的优势及优化的重要性,从而在实际应用中选择合适的排序算法和优化策略,提升程序性能。
513 1