274. H 指数

news2024/11/18 2:20:37

274. H 指数

    • 一、题目描述
    • 二、题目分析
    • 三、解题思路
      • 3.1 更换H指数定义
      • 3.2 二分法枚举H指数

一、题目描述

在这里插入图片描述

二、题目分析

这道题比较绕,理解题目意思,根据题目的说法,所谓的H指数就是:总共有 h 篇论文分别被引用了至少 h 次。且其余的 n - h 篇论文每篇被引用次数 不超过 h 次
解释示例2:
总共有1篇论文分别被引用了至少1次,且剩余的2篇论文每篇被引用次数不超过1次,之所以可以这么说,因为序号为2的这篇论文引用次数是3,大于1,所以被引用至少1次。而剩下的序号为1的论文和序号为3的论文引用次数均为1,不超过1次。所以H指数为1。当H指数为2的时候,显然不成立,所以1就是最大的H值。

三、解题思路

3.1 更换H指数定义

题目中给出的H指数定义比较绕,如果查询百度百科可以发现一个更加简单的H指数的定义:
在这里插入图片描述
那么问题就变得很简单了,将citations数组逆序排序,然后找到当前citations[i]<=i的下标i,返回i即可。比如示例1中的[6,5,3,1,0],发现i=3的时候满足条件,因此H指数为3。
解题的时候并没有采用逆序排序的方法,原因是Arrays工具类仅支持对基本类型数组升序排序,此时该如何做呢?

  1. 首先百度百科中的序号是从1开始的,而数组下标是从0开始的,百度百科中说的是直到某篇论文的序号大于该论文被引次数,序号减1就是H指数。换言之,也就是在降序数组中,直到某篇论文的索引(索引从0开始编号)大于等于该论文的被引次数,该索引就是H指数。
  2. 对百科中的条件进一步转换,百科中要求的是正向遍历降序数组,找到第一个索引值大于等于元素值的索引下标,换句话说,也就是找逆序遍历降序数组时,索引值小于元素值的索引下标+1的位置。
  3. 逆向遍历降序数组等同于正向遍历升序数组,并且升序数组中每一个元素的索引i对应着降序数组中的length - i - 1位置。
  4. 因此只需要正向遍历升序数组,找到第一个citations[i] > citations.length - 1的i,然后返回citations.length - i - 1 + 1
class Solution {
    public int hIndex(int[] citations) {
        Arrays.sort(citations);
        // 0 1 3 5 6
        // 6 5 3 3 0
        for (int i = 0; i < citations.length; i++) {
            if (citations[i] > citations.length - i - 1) {
                return citations.length - i;
            }
        }
        
        return 0;
    }
}

时间复杂度:O(nlogn),因为存在排序算法,空间复杂度O(1)

在这里插入图片描述

3.2 二分法枚举H指数

思路2采用的是一种常规思路,就是枚举求解H指数,但是枚举的过程使用二分枚举。降低枚举过程中的时间复杂度。
先说暴力枚举思路:

  1. 根据题意发现H指数最大就是数组的长度,因此H指数的范围是[0,length],比如[4,4,4,4]的H指数就是4,[0,0,0,0]的H指数就是0
  2. 第一层for循环枚举所有可能的H指数,然后对于每一个枚举的H指数,编写第二层for循环,判断当前H指数是否满足题目中的H指数判定条件,找到最大的H指数。
class Solution {
    public int hIndex(int[] citations) {
        return solve01(citations);
    }
    
    public int solve01(int[] citations) {
        int ans = 0;
        for (int i = 0; i <= citations.length; i++) {
            if (verifyH(citations, i)) {
                ans = Math.max(ans, i);
            }
        }
        return ans;
    }

    private boolean verifyH(int[] citations, int H) {
        int moreH = 0;
        for (int i = 0; i < citations.length; i++) {
            if (citations[i] >= H) {
                moreH++;
            } 
        }
        return moreH >= H;
    }
}

显然这种暴力枚举H的思路的时间复杂度是O(N),空间复杂度是O(1)

然后看二分枚举思路:

  1. left=0,right = citations.length,[left,right]是H可能的值
  2. H = (left + right) / 2
  3. 验证H是否合法,如果合法,说明可能存在更大的H,当然当前H也可能是最大的H,此时记录下H的值,将区间变为[H+1,right]
  4. 如果H不合法,说明不存在H篇论文至少被引用了H次,也就是少于H篇至少被引用了H次,此时缩小搜索区间[left, H-1]
class Solution {
    // 总体二分的思路就是二分枚举H指数
    // 对于枚举的H指数,找到最大的那一个
    // 假设当前考虑的H指数是N,如果刚好满足
    // 引用数组中有>N篇引用超过了N次,那么说明
    // 可能还有比当前N更大的H指数
    // 如果数组中>N篇引用低于N次,说明H指数枚举大了,需要缩小
    public int hIndex(int[] citations) {
        return solve02(citations);
    }

    public int solve02(int[] citations) {
        int left = 0;
        int right = citations.length;
        
        int ansH = 0;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (verifyH(citations, mid)) {
                ansH = mid;
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }

        return ansH;
    }

    private boolean verifyH(int[] citations, int H) {
        int moreH = 0;
        for (int i = 0; i < citations.length; i++) {
            if (citations[i] >= H) {
                moreH++;
            } 
        }
        return moreH >= H;
    }
}

时间复杂度:O(nlogn),空间复杂度O(1)

在这里插入图片描述

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

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

相关文章

二战阿里巴巴成功上岸,准备了小半年,要个28k应该也算不上很高吧~

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;阿里的游戏专场又是最早开始的&#xff0c;就投递了&#xf…

Spring Cloud Alibaba系列三:集成Gateway实现路由管理

文章目录Spring Cloud Alibaba系列三&#xff1a;集成Gateway实现路由管理前言1、改造父项目 pom 文件2、创建 gateway 子 module3、配置yml文件Spring Cloud Alibaba系列三&#xff1a;集成Gateway实现路由管理 spring cloud alibaba 版本对照 spring cloud alibaba 有严格的…

【MPP数据库】TiDB表分区探索与实践

方案背景——为什么要进行分区&#xff1f; 一是老板通Tidb集群每天涉及50张表、2亿多条数据回流&#xff0c;合理使用Hash可以把写入压力打散到不同的TiKV&#xff1b; 二是对于大集团数据做聚合&#xff0c;利用分区裁剪原理&#xff0c;查询时可以充当前置索引&#xff0c…

1月第4周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年1月23日-1月29日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B…

卫星地图——MAP(c++)

卫星地图 题目描述 一张矩形的卫星地图&#xff0c;有M行N列。行列中的0表示空地&#xff0c;1表示有建筑。有3种类型的建筑: L型: 仅在一行上占据连续的若干个格子&#xff0c;长度至少为2&#xff0c;至多为N C型&#xff1a;仅在一列上占据连续的若干个格子&#xff0c;…

春节机票销售大增!航空领域哪些业务风险要注意?

目录 航空领域常见的业务风险 2022年航空业务风险趋势分析 航空领域业务风险欺诈分析 如何防范航空业务风险 针对恶意网络爬虫 针对仿冒登录与内控风险 安全技术 春节旅游与出行数据陆续出炉。中国民航局数据显示&#xff0c;2023年1月21日至27日&#xff08;农历除夕至…

Linux - Linux系统

一、Linux系统Linux&#xff0c;全称GNU/Linux。Linux是一个开源、免费的操作系统&#xff0c;其稳定性、安全性、处理多并发能力已经得到业界的认可&#xff0c;目前大多数企业级应用甚至是集群项目都部署运行在linux操作系统之上&#xff0c;很多软件公司考虑到开发成本都首选…

CnOpenData中国核酸检测机构及采样点数据

一、数据简介 2020年1月21日&#xff0c;国家卫健委发布1号公告&#xff0c;将新型冠状病毒感染的肺炎纳入《中华人民共和国传染病防治法》规定的乙类传染病&#xff0c;并采取甲类传染病的预防、控制措施。目前&#xff0c;新型冠状病毒肺炎防控仍处于关键阶段&#xff0c;核酸…

ThinkPHP6 文件上传

内置文件上传使用\think\facade\Filesystem类封装方法 目录 简单上传 public存储文件 文件验证 命名规则 使用sha1 使用MD5 使用date 指定文件名称 自定义命名规则 更多上传设置 总结 简单上传 直接上传&#xff0c;使用默认上传设置 $savename \think\facade\F…

业务平台扩展支持TDengine时序数据库方案

1 场景与架构 1.1业务架构 这里涉及项目隐私&#xff0c;架构图不方便公开。 大致情况就是&#xff1a; 应用层的园区畅行、生态宜居、安全守护是我方要交付的系统。 平台层的物联网感知中台是我方平台。 1.2数据架构 从数据架构看&#xff0c;园区畅行…

第四章 git分支操作

4.1什么是分支 在版本控制过程中&#xff0c;同时推进多个任务&#xff0c;为每个任务&#xff0c;我们就可以创建每个任务的单独 分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来&#xff0c;开发自己分支的时 候&#xff0c;不会影响主线分支的运行。对于初…

优化器-RBO 的规则转化

一、RBO 背景介绍RBO&#xff08;Rule-Based Optimization&#xff0c;基于规则的优化器&#xff09;有着一套严格的使用规则&#xff0c;按照 RBO 去写 SQL 语句&#xff0c;无论数据表中的内容怎样&#xff0c;也不会影响到你的“执行计划”。换言之 RBO 对数据不“敏感”&am…

码元,码元速率,波特率,比特率(个人理解总结)

参考&#xff1a;https://baike.baidu.com/item/%E7%A0%81%E5%85%83%E4%BC%A0%E8%BE%93%E9%80%9F%E7%8E%87/6305673 https://baike.baidu.com/item/%E7%A0%81%E5%85%83%E9%80%9F%E7%8E%87/10945076 https://baike.baidu.com/item/%E6%9B%BC%E5%BD%BB%E6%96%AF%E7%89%B9%E7%BC%9…

低代码:如何成为企业业务价值提升的一大利器?

首先&#xff0c;来看低代码能为企业带来什么&#xff1f; 低代码开发能够增加软件所创造的价值&#xff0c;帮助企业机构衡量企业级低代码平台的价值并计算它将会产生的影响。 低代码在企业的现实运用中能为企业带来巨大的经济效益。众所周知&#xff0c;软件可以推动业务价值…

Cesium中的飞线效果-Shader

飞线的顶点着色器坐标系换算较为复杂。代码中的vertexShaderSource部分为cesium源码中附带的顶点着色器。后期增加了一些传参方法。 用到的GLSL的API: attribute vec2 st; 两个分量为 st.s: 飞线的长度(0-1) st.t: 飞线的宽度(0~1) czm_frameNumber 每帧都会自增,用…

metersphere将默认关闭加载的UI服务启动

目录 一、安装 二、配置 selenium-grid 三、下载驱动程序 三、运行驱动程序 四、将本地运行Selenium-server配置到MeterSphere平台 一、安装 /opt/metersphere/.env&#xff0c;有个 ui_enabled属性&#xff0c;改成true, 然后 msctl reload 二、配置 selenium-grid 这里…

pytest自动化测试执行环境切换的两种解决方案

一、痛点分析 在实际企业的项目中&#xff0c;自动化测试的代码往往需要在不同的环境中进行切换&#xff0c;比如多套测试环境、预上线环境、UAT环境、线上环境等等&#xff0c;并且在DevOps理念中&#xff0c;往往自动化都会与Jenkins进行CI/CD&#xff0c;不论是定时执行策略…

硬盘已删除的数据怎么恢复?磁盘数据恢复,试试这3大方法!

电脑里面的硬盘起着存储安装程序或者保存着重要数据的功能&#xff0c;里面有我们很多数据&#xff0c;比如图片、文件、视频等。 有时遇到一些情况&#xff0c;我们把硬盘里面的重要数据删除了&#xff0c;或者是硬盘被损坏了&#xff0c;我们该怎么办&#xff1f;磁盘数据恢…

基于声学模型共享的零资源韩语识别系统

声学模型共享方法是极低资源小语种语音识别一种解决方案&#xff0c;能够实现不需要任何语音数据的语音识别。本文介绍清华大学语音与音频技术实验室的零资源韩语语音系统&#xff0c;其在不使用任何韩语语音数据的情况下&#xff0c;在Zeroth韩语数据集上的测试CER达到了27.33…

Redis主从架构 | 黑马Redis高级篇

目录 一、搭建主从架构 1、为什么要搭建 2、准备实例和配置 3、启动 4、开启主从关系 二、 数据同步原理 1、全量同步 2、命令传播 3、增量同步 三、常见面试题 一、搭建主从架构 1、为什么要搭建 如果服务器发生了宕机&#xff0c;由于数据恢复是需要点时间&#…