力扣(H指數)

一、題目分析

(一)問題描述

給定一個整數數組 citations,其中 citations[i] 表示研究者的第 i 篇論文被引用的次數。我們需要計算并返回該研究者的 H 指數。根據維基百科定義:H 指數代表“高引用次數”,一名科研人員的 H 指數是指他(她)至少發表了 h 篇論文,并且至少有 h 篇論文被引用次數大于等于 h 。如果有多個可能的 h 值,取最大的那個。

比如,若有論文引用次數數組為 [3,0,6,1,5],經過計算其 H 指數是 3,因為有 3 篇論文(引用次數為 3、6、5 )的引用次數大于等于 3 。

(二)核心目標

遍歷處理論文引用次數數組,找到最大的 h 值,滿足存在至少 h 篇論文的引用次數 ≥ h 。

二、算法思想:排序 + 線性遍歷(貪心思想的體現)

(一)排序的作用

首先對 citations 數組進行排序(升序排序 )。排序之后,數組的順序能夠幫助我們更方便地找到符合 H 指數定義的那個 h 值。升序排序后,數組后面的元素值相對較大,我們可以從后往前或者從前往后,利用數組的有序性來判斷滿足條件的 h 。

(二)線性遍歷與貪心策略

排序完成后,進行線性遍歷。我們的貪心策略是:從數組的一端開始,尋找滿足“存在 h 篇論文引用次數 ≥ h”這一條件的最大 h 。具體來說,對排序后的數組,我們從前往后遍歷,對于索引 i ,考慮以 n - i 作為可能的 h 值(n 是數組長度,也就是論文的總篇數 ),判斷當前論文的引用次數 citations[i] 是否大于等于 n - i 。一旦找到第一個滿足該條件的 i ,那么 n - i 就是我們要找的最大 H 指數。這是因為數組是升序排列的,后面的元素值更大,當在某個位置滿足條件后,繼續往后遍歷得到的 n - i 會更小,所以第一個滿足條件的 n - i 就是最大的符合要求的 H 指數,這體現了貪心算法中“找到第一個滿足局部條件就能得到全局最優”的思想 。

三、代碼實現及詳細注釋

import java.util.Arrays;class Solution {public int hIndex(int[] citations) {// 第一步:對引用次數數組進行升序排序Arrays.sort(citations);int n = citations.length; // 獲取論文的總篇數,也就是數組的長度for (int i = 0; i < n; i++) { // 對于當前索引i,考慮h值為n - i。這里的含義是:// 假設h是n - i,那么需要至少有n - i篇論文的引用次數≥h// 由于數組是升序排序的,citations[i]及后面的元素是較大的,當citations[i] >= n - i時,// 說明從i到n - 1位置的這n - i篇論文的引用次數都 >= citations[i](因為升序),也就 >= n - iif (citations[i] >= n - i) { return n - i; // 找到滿足條件的最大h值,直接返回}}return 0; // 如果遍歷完都沒有滿足條件的,說明H指數為0(比如所有論文引用次數都為0的情況 )}
}

(一)代碼執行流程詳解

  1. 排序操作
Arrays.sort(citations);

這行代碼使用 Java 內置的 Arrays.sort 方法對 citations 數組進行升序排序。例如,對于輸入數組 [3,0,6,1,5],排序后會變成 [0,1,3,5,6] 。排序的時間復雜度為 O(nlog?n)O(n\log n)O(nlogn) ,其中 n 是數組的長度,這是由排序算法的時間復雜度決定的(Java 中 Arrays.sort 對于基本數據類型數組采用的是優化的快速排序等算法,平均時間復雜度為 O(nlog?n)O(n\log n)O(nlogn) )。

  1. 遍歷判斷過程
int n = citations.length; 
for (int i = 0; i < n; i++) { if (citations[i] >= n - i) { return n - i; }
}
  • 首先獲取數組長度 n ,代表論文的總篇數。
  • 然后進入循環遍歷,i 從 0 開始遞增到 n - 1 。對于每一個 i ,計算 n - i ,這個值代表的是假設的 h 值,含義是當前考慮有 n - i 篇論文可能滿足引用次數 ≥ n - i 。
  • 因為數組是升序排序的,citations[i] 是第 i + 1 小的引用次數(數組索引從 0 開始 ),當 citations[i] >= n - i 時,說明從第 i 篇論文開始(包括第 i 篇 ),后面一共有 n - i 篇論文(索引從 i 到 n - 1 ),它們的引用次數都大于等于 citations[i] ,自然也大于等于 n - i (因為 citations[i] >= n - i 且數組升序 )。所以此時 n - i 就是滿足條件的 H 指數,直接返回即可。這是因為我們是從前往后遍歷,一旦找到第一個滿足條件的 i ,對應的 n - i 就是最大的可能的 H 指數。比如排序后的數組 [0,1,3,5,6] ,n = 5 ,當 i = 2 時,n - i = 3 ,citations[2] = 3 ,滿足 citations[i] >= n - i ,所以返回 3 ,也就是正確的 H 指數。
  1. 返回默認值
return 0; 

如果循環遍歷結束后,沒有找到滿足 citations[i] >= n - i 的情況,說明所有論文的引用次數都非常低,比如數組全為 0 ,此時 H 指數為 0 ,所以返回 0 。

四、算法的時間復雜度和空間復雜度分析

(一)時間復雜度

  • 排序操作的時間復雜度:使用 Arrays.sort 對數組進行排序,其時間復雜度為 O(nlog?n)O(n\log n)O(nlogn) ,其中 n 是數組 citations 的長度。
  • 線性遍歷的時間復雜度:排序后進行的線性遍歷,時間復雜度為 O(n)O(n)O(n) ,n 同樣是數組長度。

所以,整個算法的時間復雜度由排序操作主導,為 O(nlog?n)O(n\log n)O(nlogn)

(二)空間復雜度

  • 排序操作在 Java 中,對于基本數據類型數組的 Arrays.sort 方法,采用的是原地排序(大部分情況下 ),不需要額外的大量空間,空間復雜度為 O(log?n)O(\log n)O(logn) (主要是排序過程中遞歸調用棧或者用于輔助排序的空間,基于快速排序等算法的實現 )。
  • 其他變量如 n 、i 等都是常數級別的空間占用。

所以,整個算法的空間復雜度為 O(log?n)O(\log n)O(logn) (主要由排序操作決定 ),在大多數情況下可以認為是較為高效的空間利用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918380.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918380.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918380.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

標準io(1)

標準I/O基礎概念標準I/O&#xff08;Standard Input/Output&#xff09;是C語言提供的一組高級文件操作函數&#xff0c;位于<stdio.h>頭文件中。與低級I/O&#xff08;如Unix的系統調用read/write&#xff09;相比&#xff0c;標準I/O引入了緩沖機制&#xff0c;能顯著提…

線性代數1000題學習筆記

1000題線代基礎第一章1-101000題線代基礎第二章1-171000題線代基礎第三章1-11

LeetCode算法日記 - Day 8: 串聯所有單詞的子串、最小覆蓋子串

目錄 1.串聯所有單詞的子串 1.2 解法 1.3 代碼實現 2. 最小覆蓋子串 2.1 題目解析 2.2 解法 2.3 代碼實現 1.串聯所有單詞的子串 30. 串聯所有單詞的子串 - 力扣&#xff08;LeetCode&#xff09; 給定一個字符串 s 和一個字符串數組 words。 words 中所有字符串 長度…

linux實戰:基于Ubuntu的專業相機

核心組件就是QTimerOpenCV的組合方案攝像頭啟停控制用QPushButton實現&#xff0c;幀顯示必須用QLabel而不能用普通控件&#xff0c;視頻流刷新用QTimer比多線程更簡單想快速實現攝像頭控制功能&#xff0c;核心組件就是QTimerOpenCV的組合方案。攝像頭啟停控制用QPushButton實…

《深度剖析前端框架中錯誤邊界:異常處理的基石與進階》

錯誤邊界作為一種特殊的組件機制&#xff0c;正悄然重塑著應用應對異常的底層邏輯。它并非簡單的代碼片段組合&#xff0c;而是一套貫穿組件生命周期的防護體系&#xff0c;其核心價值在于將局部錯誤的影響牢牢鎖定在可控范圍內&#xff0c;避免整個應用陷入不可挽回的崩潰狀態…

6GB顯存玩轉SD微調!LoRA-scripts本地部署教程,一鍵煉出專屬AI畫師

一、介紹LoRA-scripts&#xff08;又名 SD-Trainer&#xff09;&#xff0c;是一個專為訓練低秩自適應&#xff08;LoRA&#xff09;模型設計的開源工具集主要應用于Stable Diffusion等AI繪圖模型的微調&#xff0c;幫助用戶高效創建定制化風格、角色或概念的輕量級模型。目前已…

探索AI的數學奇跡:Gemini 2.5 Pro如何摘得IMO金牌

?? 引言:從人類天才到AI奇才的跨越 想象一下,一個AI模型坐在國際數學奧林匹克(IMO)的考場里,手里拿著筆(好吧,其實是處理token),面對那些讓高中生們頭疼不已的難題。它不是靠死記硬背,而是通過深思熟慮的推理,一步步攻克難關。這聽起來像科幻小說,但2025年,這已…

MCP學習與實踐

目錄 1.MCP簡介 1.1 MCP是什么 1.2 MCP與Agent關系&#xff1a; 1.3 MCP的架構 2. MCP原理 2.1 MCP 工作過程 2.2 MCP 通訊方式 2. MCP使用 2.1 cursor中增加MCP-SSE(高德地圖MCP) 2.2 cursor中增加MCP-STDIO&#xff08;12306-MCP&#xff09; 本文詳細講解了什么是…

MySQL(187)如何使用pt-query-digest進行查詢分析?

使用 pt-query-digest 工具可以幫助分析 MySQL 查詢的性能&#xff0c;找出慢查詢、頻繁查詢以及消耗資源較多的查詢&#xff0c;從而為優化提供依據。以下是詳細深入的使用 pt-query-digest 進行查詢分析的步驟和相關示例。 一、安裝 pt-query-digest pt-query-digest 是 Perc…

分享一個基于Python和Hadoop的的電信客戶特征可視化分析平臺 基于Spark平臺的電信客服數據存儲與處理系統源碼

&#x1f495;&#x1f495;作者&#xff1a;計算機源碼社 &#x1f495;&#x1f495;個人簡介&#xff1a;本人八年開發經驗&#xff0c;擅長Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬蟲、大數據、機器學習等&#xff0c;大家有這一塊的問題…

初識STL

一 、STL的誕生在C發展早期&#xff0c;程序員在不同的項目中需要反復編寫相似的數據結構和算法。重復開發帶來以下問題&#xff1a;代碼冗余&#xff1a;每個項目都要重新實現基本數據結構和算法維護困難&#xff1a;不同人編寫的代碼風格不一致&#xff0c;難以維護效率低下&…

DDoS 防護的未來趨勢:AI 如何重塑安全行業?

隨著網絡攻擊規模和復雜性的不斷升級&#xff0c;分布式拒絕服務&#xff08;DDoS&#xff09;攻擊已成為企業數字化轉型中的一大威脅。傳統防御手段在應對智能化、動態化的攻擊時逐漸顯露出局限性。而人工智能&#xff08;AI&#xff09;技術的崛起&#xff0c;正為 DDoS 防護…

【每天一個知識點】深度領域對抗神經網絡

Deep Domain Adversarial Neural Network&#xff08;深度領域對抗神經網絡&#xff0c;DDANN&#xff09; 是一類結合 深度學習 與 領域自適應&#xff08;domain adaptation&#xff09; 思想的神經網絡結構&#xff0c;主要用于不同數據域之間的知識遷移&#xff0c;尤其是在…

【C語言】深入理解預處理

文章目錄一、預定義符號二、#define定義常量&#xff1a;便捷的符號替換常見用法示例&#xff1a;注意事項&#xff1a;三、#define定義宏&#xff1a;帶參數的文本替換關鍵注意點&#xff1a;四、帶有副作用的宏參數五、宏替換的規則&#xff1a;預處理的執行步驟重要注意&…

展銳平臺(Android15)WLAN熱點名稱修改不生效問題分析

前言 在展銳Android V項目開發中&#xff0c;需要修改softAp/P2P熱點名稱時&#xff0c;發現集成GMS后直接修改framework層代碼無效。具體表現為&#xff1a; 修改packages/modules/Wifi/WifiApConfigStore中的getDefaultApConfiguration方法編譯燒錄后修改不生效 問題根源在…

wsl ubuntu訪問(掛載)vmware vmdk磁盤教程

之前使用VMware Workstation 虛擬機跑了個ubuntu&#xff0c;現在改用wsl了&#xff0c; 想把vmware的磁盤掛載到wsl ubuntu。一、磁盤合并我原先的vmware跑的ubuntu存在多個vmdk文件&#xff08;磁盤文件&#xff09;&#xff0c;需要先將磁盤合并成一個才方便掛載。首先你電腦…

UGUI源碼剖析(3):布局的“原子”——RectTransform的核心數據模型與幾何學

UGUI源碼剖析&#xff08;第三章&#xff09;&#xff1a;布局的“原子”——RectTransform的核心數據模型與幾何學 在前幾章中&#xff0c;我們了解了UGUI的組件規范和更新調度機制。現在&#xff0c;我們將深入到這個系統的“幾何學”核心&#xff0c;去剖析那個我們每天都在…

c++注意點(15)----設計模式(橋接模式與適配器模式)

一、結構型設計模式兩者有點相似&#xff0c;都是為了做到解耦的功能。適配器模式是一種結構型設計模式&#xff0c; 它能使接口不兼容的對象能夠相互合作。橋接模式是一種結構型設計模式&#xff0c; 可將一個大類或一系列緊密相關的類拆分為抽象和實現兩個獨立的層次結構&…

DuoPlus支持導入文件批量配置云手機參數,還優化了批量操作和搜索功能!

作為我常用的一款還不錯的跨境工具&#xff0c;DuoPlus云手機幫我高效完成了很多跨境工作&#xff0c;它的功能也在逐步完善和優化&#xff0c;今天來聊聊它最近新更新的一些功能。功能更新一覽新增導入文件配置參數&#xff1a;批量初始化代理、批量修改參數支持導入文件一鍵配…

PLC如何實現通過MQTT協議物聯網網關接入管理云平臺

在工業4.0與智能制造浪潮下&#xff0c;企業亟需實現設備數據的高效采集與云端協同&#xff0c;以支撐遠程監控、預測性維護等場景。工業智能網關憑借其強大的協議解析能力、邊緣計算功能及安全傳輸機制&#xff0c;成為PLC接入云平臺的核心解決方案。本文將從技術架構、功能模…