【刷题笔记】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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

招募引流模式是实体门店吸引顾客的一种有效策略

在如今激烈的市场竞争和庞大的客户需求中&#xff0c;应该采取什么样的方式来应对&#xff0c;才能找到自己的一席之地。招募引流模式是实体门店吸引顾客的一种有效策略&#xff0c;通常招募体验官或合作伙伴&#xff0c;让他们协助门店进行推广活动&#xff0c;达到增加客流量…

【代码】微电网两阶段鲁棒优化经济调度方法(完美复现)matlab-yalmip-cplex/gurobi

程序名称&#xff1a;两阶段鲁棒优化—微电网两阶段鲁棒优化经济调度方法_刘一欣 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 简介&#xff1a;针对微电网内可再生能源和负荷的不确定性&#xff0c;建立了 min-max-min 结构的两阶段鲁棒优化模型&#xff0c;可得到最恶…

图解Redis适用场景

Redis以其速度而闻名。 1 业务数据缓存 1.1 通用数据缓存 string&#xff0c;int&#xff0c;list&#xff0c;map。Redis 最常见的用例是缓存对象以加速 Web 应用程序。 此用例中&#xff0c;Redis 将频繁请求的数据存储在内存。允许 Web 服务器快速返回频繁访问的数据。这…

selenium已知一个元素定位同级别的另一个元素

1.需求与实际情况 看下图来举例 &#xff08;1&#xff09;需求 想点击test22&#xff08;即序号-第9行&#xff09;这一行中右边的“复制”这一按钮 &#xff08;2&#xff09;实际情况 只能通过id或者class定位到文件名这一列的元素&#xff0c;而操作这一列的元素是不…

C++ : 友元(未完结)

不能从外部访问类的私有数据成员和方法&#xff0c;但这条规则不适用于友元类和友元函数。要声明友元 类或友元函数&#xff0c;可使用关键字 friend&#xff0c;通过让函数成为类的友元&#xff0c;可以赋予该函数与类的成员函数 同的访问权限。 生活中你的家有客厅 (Public)…

使用最小花费爬楼梯(力扣LeetCode)动态规划

使用最小花费爬楼梯 题目描述 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶…

第71讲:MySQL锁机制详解:表级锁、元数据锁和意向锁的全面解析与实践指南

MySQL中的表级锁 文章目录 MySQL中的表级锁1.MySQL中表级锁的概念2.表锁的概念以及基本使用2.1.表锁的分类以及概念2.2.表锁的使用语法2.3.表共享读锁的基本使用2.4.表独占写锁的基本使用 3.元数据锁的概念以及基本使用3.1.元数据锁的概念3.2.常见的SQL操作所对应的元数据锁3.3…

婴儿专用洗衣机哪个牌子比较好?好用迷你洗衣机品牌推荐

当婴儿的到来&#xff0c;确实会给家庭带来许多变化&#xff0c;就好比如对于宝宝相关衣物的清洗需求。对于新生儿及婴幼儿的衣服&#xff0c;一般都要给予特殊的照顾与清洗&#xff0c;以保证不含细菌及过敏原。尤其是刚刚出生的婴儿&#xff0c;这时候宝宝们的皮肤很是幼嫩。…

APP端-阻止ios 默认全屏模式显示

问题描述: ios 默认全屏模式显示&#xff0c;该加的参数都加了&#xff0c;但是还是会自动默认全屏模式 代码如下: <video autoPlay loop playsInline muted{true} poster{UPIPreload}><source src{"video/your.mp4"} /></video>于是乎跟我们的A…

机器人制作开源方案 | 网球自动拾取机

作者&#xff1a;柳文浩、李浩杰、苏伟男、贾思萌、张天芸 单位&#xff1a;西安外事学院 指导老师&#xff1a;胡宝权、陈小虎 1. 产品说明 1.1 设计目的 近年来&#xff0c;网球运动越来越受到老百姓的欢迎&#xff0c;各种规模的比赛层出不穷。然而由于网球运动极为激烈…

使用jenkins和tomcat创建并部署maven项目

准备三台服务器&#xff1a; 192.168.58.139 部署tomcat 详细参照&#xff1a;http://t.csdnimg.cn/Yp2z2 192.168.58.140 部署gitlab 详细参照&#xff1a;http://t.csdnimg.cn/Sb1uz 192.168.58.153 部署Jenkins 详细参照…

代码随想录训练营第30天 | 332.重新安排行程、51. N皇后、37. 解数独

332.重新安排行程 题目链接&#xff1a;重新安排行程 解法&#xff1a; 这个题&#xff0c;卡哥的思路会超时。辛辛苦苦看懂了卡哥的思路&#xff0c;结果超时了&#xff0c;直接崩溃。 看了leetcode官方的思路&#xff0c;非常简洁&#xff0c;但是里面的深意还是不太懂。 由…

excel对号怎么打

对号无论是老师批改作业&#xff0c;还是在标注某些数据的时候都会用到&#xff0c;但这个符号在键盘上是没有的&#xff0c;那么excel对号怎么打出来呢&#xff0c;其实只要使用插入符号功能就可以了。 excel对号怎么打&#xff1a; 第一步&#xff0c;选中想要打出对号的单…

OpenCV快速入门:移动物体检测和目标跟踪

文章目录 前言一、移动物体检测和目标跟踪简介1.1 移动物体检测的基本概念1.2 移动物体检测算法的类型1.3 目标跟踪的基本概念1.4 目标跟踪算法的类型 二、差值法检测移动物体2.1 差值法原理2.2 差值法公式2.3 代码实现2.3.1 视频或摄像头检测移动物体2.3.2 随机动画生成的移动…

利用kibana 快照备份es数据库

环境 主机名ip地址组件ambari-hadoop1192.168.10.101ambari-hadoop2192.168.10.102kibanaambari-hadoop3192.168.10.103es 这里我们利用共享文件系统&#xff0c;存储快照&#xff0c;所以需要利用到nfs&#xff08;NFS&#xff08;Network File System&#xff09;是一种分布…

AI超级个体:ChatGPT与AIGC实战指南

目录 前言 一、ChatGPT在日常工作中的应用场景 1. 客户服务与支持 2. 内部沟通与协作 3. 创新与问题解决 二、巧用ChatGPT提升工作效率 1. 自动化工作流程 2. 信息整合与共享 3. 提高决策效率 三、巧用ChatGPT创造价值 1. 优化产品和服务 2. 提高员工满意度和留任率…

锂电行业废水及母液除铊解决方案,除铊树脂技术

锂电池原材料和生产设备的制造、电池回收和处理等&#xff0c;产业的发展会带来铊排放问题。除了锂电池生产过 程中存在的铊污染外&#xff0c;企业的生活污水或者初期雨水也含有铊&#xff0c;因为铊是一种广泛存在于自然环境中的 元素&#xff0c;存在于饮用水、土壤和食物中…

【Linux】初识重定向(输入输出)

一切皆文件 这是Linux的设计理念&#xff0c;因为这个理念的存在我们可以使用统一的方法对待不同的东西&#xff0c;&#xff0c;这也是为什么嵌入式之类的会需要Linux&#xff0c;因为用LInux来操纵硬件真的很方便 另外我们下文也会都基于这个理念来命名&#xff0c; 比如&am…

【前端开发】Remix与Next.js

很容易&#xff0c;我们被问到的最大问题是&#xff1a; Remix与Next.js有何不同&#xff1f; 看来我们必须回答这个问题&#xff01;我们想直接而不带戏剧性地解决这个问题。如果你是Remix的粉丝&#xff0c;并且想开始在推特上对这篇文章做出沾沾自喜的反应&#xff0c;我们恳…

构建沉浸式 AI 文本编辑器:开源 3B 编辑器的设计原则与思路

借助于在 AutoDev 与 IDE 上的 AI 沉浸式体验设计&#xff0c;我们开始构建一个 AI 原生的文本编辑器&#xff0c;以探索沉浸式创作体验。其适用于需求编写、架构文档等等文档场景&#xff0c;以加速软件开发中的多种角色的日常工作。 GitHub&#xff1a;https://github.com/un…