【刷题笔记】H指数||数组||二分查找的变体

H指数

1 题目描述

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

给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。

根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 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


2 思路

反正不是我想出来的,随便写写

解题方法来源

这道题也是一道“翻译不当人”的典范,我们可以将这句话重新翻译一下

找到一个阈值h,数组中大于等于h的元素数量也大于等于h。同时保证阈值为h+1的时候,找不到足够数量的元素个数。

然后我们更加格式化地理解一下上面这句话:假设有一个统计函数counter(c)来统计数组中大于等于c的元素个数,counter(h) >= h, counter(h+1) < h+1

比如我们设citations=[13, 7, 6, 18, 12, 20, 20, 3, 0, 7],我们用gif的形式来表现当c=1、2、3...10的时候,数组中满足条件的元素个数。

在这里插入图片描述

counter(1) = 9 >= 1
counter(2) = 9 >= 2
counter(3) = 9 >= 3
counter(4) = 8 >= 4
counter(5) = 8 >= 5
counter(6) = 8 >= 6
counter(7) = 7 >= 7
-------------------
counter(8) = 5 < 8
counter(9) = 5 < 9
counter(10) = 5 < 10

我们用下图表示:

在这里插入图片描述

假设我们有一个数组[1, 2, ... , len(citiations)](设为nums),其中一定有一个分界线h,左和右分别表示满足或者不满足条件。

而当我们将上述数组替换成counter(c),即counters

在这里插入图片描述

很明显,counters数组是一个有序的、递减的数组。

在这里插入图片描述

好像事情朝着有趣的方向发展了,我们有一个有序数组counters,我们有一个判定条件counters[i] >= i+1(i在这里是下标),我们需要从有序数组中找到最后一个符合条件的元素

But, 如果我们对[1, 2, ... , len(citiations)](设为nums)数组进行遍历,对每个元素都施加counter函数来获得最终的counters数组,太耗时了。我们看看,能不能对上面的表述进行一些改造,毕竟nums和counters是一一对应的,我们可以在遍历到nums对应的元素时,再计算对应的counter:

我们有一个有序数组[1, 2, … , len(citiations)](表示为nums),我们有一个判定条件counter(nums[i]) >= i+1(i在这里是下标),我们需要从有序数组中找到最后一个符合条件的元素

在二分法中,我比较喜欢直接使用第1个元素、第2个元素、……、第n个元素这样的方式来指示元素的位置。

二分法中具有两个关键问题:

  • mid元素的下标计算
  • left指针和right指针的跳转方式

mid的计算,其实和left以及right指针的跳转方式相关。比如我们这个题目中,需要找到最后一个符合条件的元素。

也就是说,假设counter(nums[mid]) >= nums[mid],我们知道nums[mid]满足条件,但是nums[mid+1]还满足吗?不一定!所以left就 不能 直接跳转到mid的右边,而是 只能 直接跳转到mid上。

 if (counter(cs, nums[mid_index]) >= nums[mid_index]) {l = real_mid;} else {r = real_mid - 1;}

在这里插入图片描述

那么我们如何计算mid呢?这就需要我们考虑当只剩下两个元素的时候,mid到底是在left上还是在right上。如果让mid=left,下一步如果left需要跳转,left=mid,然后mid=left。。。。。。无限循环。

所以我们先看怎么跳转,再回过头想怎么计算mid。

也就是说,如果当前的[left~right]之间的元素个数为偶数,我们需要让mid指针指向中间两个元素的后一个元素。

class Solution {public int hIndex(int[] cs) {int[] nums = new int[cs.length];for (int i = 0; i < cs.length; i++) {nums[i] = i + 1;}int l = 1;int r = cs.length;while (l < r) {int mid_index = ((l + r) / 2); // 注意,我们这里的l和r都是元素的真实位置(从1开始),而不是索引(从0开始),// (l + r) / 2 在奇数情况下是中间元素的位置,// 偶数情况下是两个中间元素的前一个,同时也是后一个元素在数组中的索引位置。int real_mid = mid_index + 1; // 中间两个元素中后一个的元素的真实位置if (counter(cs, nums[mid_index]) >= nums[mid_index]) {l = real_mid; // left转移到mid} else {r = real_mid - 1; // right转移到mid - 1}}return counter(cs, l) >= l ? l : 0; // 有两种情况,一个是cs中只有一个元素,另一种情况是所有元素都为0}int counter(int[] cs, int mid) {int ans = 0;for (int i : cs) if (i >= mid) ans++; // 计算citiations中大于等于mid的元素数量。return ans;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/178742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何关闭MIUI新版本中加入的“system锁”校验!

看文章前先知道这几点&#xff1a; 1&#xff1a;目前miui很多机器尤其是新发布的机器都已经加入了BL锁&#xff0c;以后发布的机器都会加入&#xff08;谷歌也有此要求&#xff09;&#xff0c;虽然可以官方申请解锁&#xff0c;但是解锁流程做的不是很好&#xff0c;很多人依…

数据结构与算法之美代码:二分查找2

目录 二分查找的变形问题代码 二分查找的变形问题 代码 package com.athome.search;public class BinarySearchDemo {public static void main(String[] args) {int[] arr {1,3,4,5,6,8,8,8,11,18};int index1 bsearch1(arr, arr.length, 8);int index2 bsearch2(arr, arr.l…

C语言指针 自创strcpy 去掉空格键

学习指针&#xff0c;我们该学习其如何使用&#xff0c;下面为大家举一个例子&#xff1a; 如何自己写一个库函数———strcpy虽然有一点区别&#xff0c;但大体思路是相似的 下面是一个例子&#xff1a; #include<stdio.h> void mystrcpy(char* a, const char* b) {w…

第六节HarmonyOS UIAbility内页面的跳转和数据传递

一、页面跳转 在一个应用包含一个UIAbility的场景下&#xff0c;可以通过新建多个页面来实现和丰富应用的内容。这会涉及到UIAbility内页面的新建以及UIAbility内页面的跳转和数据传递。 打开DevEco Studio&#xff0c;选择一个Empty Ability工程模板&#xff0c;创建一个工程&…

阶段三:Web开发(掌握基本的Web开发框架,如Flask或Django)

1. Flask&#xff1a;Flask是一个轻量级的Python Web框架&#xff0c;它提供了基本的工具和扩展来构建Web应用程序。Flask的设计理念是简单、灵活&#xff0c;可以轻松地与第三方库集成。学习Flask需要掌握以下内容&#xff1a;* 如何安装和配置Flask。 * 如何创建Web应用程序的…

MySQL数据库【一】

博学而笃志&#xff0c;切问而近思 文章目录 数据库简介服务器、数据库以及表的关系连接数据库数据库操作命令创建数据库查看数据库创建语句查看数据库使用数据库修改数据库删除数据库 数据库字符集和校验规则查看系统默认字符集查看系统默认校验规则查看数据库支持的字符集查看…

网工内推 | 外企网工,五险一金,弹性工作,最高30k*14薪

01 金蝶软件&#xff08;中国&#xff09;有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、合理规划公司网络&#xff0c;保障网络架构的合理性、可靠性及前瞻性&#xff1b; 2、负责公司网络运维&#xff0c;处理日常运维事件&#xff0c;保障网络的稳定可…

Arch Linux 安装 dwm 窗口管理器

窗口管理器是管理桌面上各种窗口的组件&#xff0c;主要功能有&#xff1a;窗口堆叠方式&#xff0c;窗口移动规则等。大多数人接触到的是堆叠式窗口管理器&#xff0c;一个窗口可以叠放在其他窗口之上&#xff0c;调整窗口的主要方式是鼠标。而dwm&#xff08;Dynamic Window …

Python(八十九)函数的参数的内存分析

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(9)

注解目录 1、znFAT 的起源 1.1 源于论坛 &#xff08;那是一个论坛文化兴盛的年代。网友 DIY SDMP3 播放器激起了我的兴趣。&#xff09; 1.2 硬盘 MP3 推了我一把 &#xff08;“坤哥”的硬盘 MP3 播放器&#xff0c;让我深陷 FAT 文件系统不能自拔。&#xff09; 1.3 我…

手机爬虫用Fiddler详细教程

如果你正在进行手机爬虫的工作&#xff0c;那么一款强大而又实用的网络调试工具Fiddler将会是你的好帮手。今天&#xff0c;我将和大家分享一份详细的Fiddler教程&#xff0c;教你如何使用它来轻松捕获和分析手机App的网络请求。让我们一起来探索Fiddler的功能和操作&#xff0…

Java 发送邮件

Java 发送邮件 使用Java应用程序发送E-mail十分简单&#xff0c;但是首先你应该在你的机器上安装JavaMail API 和Java Activation Framework (JAF) 。 你可以在 JavaMail (Version 1.2) 下载最新的版本。 你可以再 在JAF (Version 1.1.1)下载最新的版本。 下载并解压这些文…

Python与ArcGIS系列(十三)UpdateCursor方法

目录 0 简述1 准备工作2 UpdateCursor更新行0 简述 如果需要编辑或删除表或要素类中的行数据,可以使用更新游标(UpdateCursor)。同插入游标(InsertCursor)一样,更新游标(UpdateCursor)中的数据内容可以通过使用where条件语句来控制。本篇将介绍如何利用arcpy实现通过U…

自制编程语言(第三弹)定义Token

终于到了激动人心的实现时候了。为了实现我们的自制语言&#xff0c;我们需要的步骤为&#xff1a; 词法分析语法分析语义分析&#xff08;此处不设置&#xff09;解释器 详细完整的代码可以点击这里查看github项目。 词法分析&#xff1a; 将代码片段识别为关键词、标识符、…

你敢信?四行Python代码就能知道你那的天气!

今天给大家带来的Python实战项目是四行Python代码获取所在城市的天气预报&#xff0c;我们隐隐听到唏嘘声&#xff0c;不信四行Python代码可以获取是吗?那我们一起来看看&#xff1a; 四行Python代码就能知道你那的天气&#xff0c;你敢信&#xff1f; 使用Python获取天气预报…

paddleocr笔记

PP-OCRv1 PP-OCR中&#xff0c;对于一张图像&#xff0c;需要完成以下3个步骤提取其中的文字信息&#xff1a; 使用文本检测方法&#xff0c;获取文本区域多边形信息&#xff08;PP-OCR中文本检测使用的是DBNet&#xff0c;因此获取的是四点信息&#xff09;。对上述文本多边形…

sqli-labs关卡21(基于cookie被base64编码的报错盲注)通关思路

文章目录 前言一、回顾上一关知识点二、靶场需要了解的前置知识1、什么是base64编码&#xff1f; 三、靶场第二十一关通关思路1、判断注入点2、爆数据库名3、爆数据库表4、爆数据库列5、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于…

Toast UI Editor上传图片到Flask

Toast UI Editor国内文档几乎搜不到&#xff0c;国外文档也写得不是特别项目&#xff0c;没有太多举例的demo。一开始选择使用这个就是因为UI好看。不过看看源码把思路滤清了。 他会给把图片转成Base64&#xff0c;到时候发表单直接丢过去就行了&#xff0c;blob这个参数能拿到…

vue+elementUI的tabs与table表格联动固定与滚动位置

有个变态的需求&#xff0c;要求tabs左侧固定&#xff0c;右侧是表格&#xff0c;点击左侧tab&#xff0c;右侧表格滚动到指定位置&#xff0c;同时&#xff0c;右侧滚动的时候&#xff0c;左侧tab高亮相应的item 上图 右侧的高度非常高&#xff0c;内容非常多 常规的瞄点不适…

C++中的类与对象

类和对象的基本概念 C 和 C中 struct 区别 c 语言 struct 只有变量 c语言 struct 既有变量&#xff0c;也有函数 类的封装 我们编写程序的目的是为了解决现实中的问题&#xff0c;而这些问题的构成都是由各种事物组成&#xff0c;我们在计算机中要解决这种问题&#x…