41.尋找缺失的第一個正數:原地哈希算法詳解

文章目錄

    • 引言
    • 問題描述
    • 方法思路:原地哈希算法
      • 算法步驟
    • 完整代碼實現
    • 關鍵代碼解析
    • 復雜度分析
    • 示例說明
    • 總結

引言

在算法面試和數據處理中,尋找缺失的第一個正數是一個經典問題。題目要求給定一個未排序的整數數組,找到其中缺失的最小正整數,且時間復雜度需為O(n),空間復雜度為O(1)。本文將詳細解析如何通過原地哈希算法高效解決這一問題,并提供完整的Java代碼實現。


問題描述

給定一個包含n個整數的數組nums,找出其中沒有出現的最小的正整數
示例

  • 輸入:nums = [1,2,0],輸出:3
  • 輸入:nums = [3,4,-1,1],輸出:2

限制條件

  • 時間復雜度:O(n)
  • 空間復雜度:O(1)

方法思路:原地哈希算法

傳統方法(如排序或哈希表)無法滿足空間復雜度要求。原地哈希的核心思想是將數值映射到數組索引上,通過交換操作將每個正整數放到其“正確位置”。

算法步驟

  1. 處理數組元素

    • 遍歷數組,若當前元素nums[i]是正整數且在[1, n]范圍內,則將其交換到索引nums[i]-1的位置。
    • 使用while循環確保交換后的新元素也被正確處理。
  2. 查找缺失值

    • 再次遍歷數組,第一個滿足nums[i] != i+1的位置即為缺失的最小正數。
    • 若所有位置均正確,則缺失值為n+1

完整代碼實現

public class FirstMissingPositive {public int firstMissingPositive(int[] nums) {int n = nums.length;// 原地哈希:將數值x交換到索引x-1的位置for (int i = 0; i < n; i++) {while (nums[i] >= 1 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {swap(nums, i, nums[i] - 1);}}// 查找第一個不滿足nums[i] == i+1的位置for (int i = 0; i < n; i++) {if (nums[i] != i + 1) {return i + 1;}}return n + 1;}// 交換數組中的兩個元素private void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}
}

關鍵代碼解析

  1. 原地哈希處理

    while (nums[i] >= 1 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {swap(nums, i, nums[i] - 1);
    }
    
    • 條件1nums[i]必須是有效正整數(1 ≤ x ≤ n)。
    • 條件2:若目標位置的值已正確,則無需交換。
    • 循環處理:交換后,新的nums[i]可能仍需調整,因此使用while而非if
  2. 查找缺失值

    if (nums[i] != i + 1) {return i + 1;
    }
    
    • 第一個不滿足nums[i] == i+1的索引i,其對應的i+1即為缺失值。

復雜度分析

  • 時間復雜度:O(n)
    每個元素最多被交換一次,兩次遍歷時間復雜度均為O(n)。
  • 空間復雜度:O(1)
    僅使用常數級別的額外空間。

示例說明

以輸入nums = [3,4,-1,1]為例:

  1. 原地哈希處理
    • 遍歷到3,將其交換到索引2的位置,數組變為[-1,4,3,1]
    • 遍歷到4,將其交換到索引3的位置,數組變為[-1,1,3,4]
    • 遍歷到1,將其交換到索引0的位置,數組變為[1,-1,3,4]
  2. 查找缺失值
    • 索引1的值為-1,不滿足nums[1] == 2,返回2

總結

原地哈希算法通過索引映射元素交換,將時間復雜度優化至O(n),空間復雜度優化至O(1)。該方法不僅高效,還能幫助深入理解數組索引與數值之間的關系。掌握這一算法,可輕松應對類似的高頻面試題。

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

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

相關文章

matlab 中function的用法

matlab 中function的用法 前言介紹1. 基本語法示例&#xff08;1&#xff09;可以直接輸出&#xff08;2&#xff09;調用函數 2.輸入參數和輸出參數示例多輸入參數和輸出參數定義一個函數&#xff0c;計算兩個數的和與差&#xff1a;調用該函數&#xff1a; 3. 默認參數示例 4…

HarmonyOS開發之基于子窗口實現應用內懸浮窗

鴻蒙開發&#xff1a;基于子窗口實現應用內懸浮窗(含完整代碼示例) 在現代移動應用中&#xff0c;懸浮窗/懸浮球是一種非常實用的交互方式&#xff0c;常用于展示快捷入口、實時通知、視頻播放等場景。例如&#xff1a; 聊天應用中的小助手按鈕視頻應用的畫中畫功能游戲或工具類…

可以下載blender/fbx格式模型網站

glbxz.com glbxz.com可以下載blender/fbx格式模型。當然里面有免費的

250505_HTML

HTML 1. HTML5語法與基礎標簽1.1 HTML5特性1.1.1 空白折疊現象1.1.2 轉義字符 1.2 HTML注釋1.3 基礎標簽1.3.1 div標簽1.3.2 標題標簽1.3.3 段落標簽1.3.4 title1.3.5 meta 1.4 html骨架1.4.1 DTD1.4.2 html標簽1.4.3 head與body標簽 1.5 div標簽詳解1.5.1 常見class類名 1.6 列…

數據封裝的過程

數據的封裝過程 傳輸層 UDP 直接將數據封裝為UDP數據報?&#xff0c;添加UDP頭部&#xff08;8B&#xff09;。 要點&#xff1a; UDP首部簡單&#xff0c;無連接不可靠、無重傳、無擁塞控制&#xff0c;適用于實時性要求較高的通訊&#xff1b;不需要源端口或不想計算檢…

面向AGI的語言認知操作系統形式化模型

鄒曉輝融智學語言數據庫體系的數學表達 ——面向AGI的語言認知操作系統形式化模型 1. 基礎定義與符號系統 設語言宇宙 L 為所有語言要素的集合&#xff0c;其結構可分解為&#xff1a; LY(言)U(語)A(用) 其中&#xff1a; YPGS &#xff08;音/形/義三元組&#xff09; U?…

基于 Spring Boot 瑞吉外賣系統開發(十)

基于 Spring Boot 瑞吉外賣系統開發&#xff08;十&#xff09; 修改菜品 修改菜品是在原有的菜品信息的上對菜品信息進行更新&#xff0c;對此修改菜品信息之前需要將原有的菜品信息在修改界面進行展示&#xff0c;然后再對菜品信息進行修改。 修改菜品分為回顯菜品信息和更…

Three.js和WebGL區別、應用建議

Three.js 和 WebGL 是用于在瀏覽器中創建 3D 圖形的兩種技術,它們之間有明顯的區別和適用場景。 對于一般數據展示和模型展示而言,應用更多的是three.js,畢竟相對學習成本來說webGL跟高,需要投入更多的精力和基礎功能的開發和驗證上。而three.js封裝了webGL的功能,開發相對…

【Vue】移動端開發(Uni-app、Taro)

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;Vue 文章目錄 1. Uni-app 與 Taro 簡介1.1 什么是 Uni-app&#xff1f;1.2 什么是 Taro&#xff1f;1.3 Uni-app vs Taro&#xff08;對比圖&#xff09; 2. 項目初始化與目錄結構2.1 初始化 Uni-app 項目2.2 初始化 Taro 項目&…

自定義SpringBoot Starter-筆記

SpringBoot Starter的介紹參考&#xff1a; Spring Boot Starter簡介-筆記-CSDN博客。這里介紹如何自定義一個springBoot Starter。 1. 項目結構 創建一個 Maven 項目&#xff0c;結構如下&#xff1a; custom-spring-boot-starter-demo/ ├── custom-hello-jdk/ # jdk模…

linux >!

Linux 中 >! 符號的含義與用法 ?基本定義?在 Linux Shell 中,>! 是由 > 和 ! 組合的特殊符號,主要用于 ?強制覆蓋文件?。其行為與常規的 > 類似,但額外添加了忽略潛在限制的功能。 ?典型場景?繞過 noclobber 限制?: 若 Shell 啟用了 noclobber 選項(默…

共鑄價值:RWA 聯合曲線價值模型,撬動現實資產生態

摘要 本文提出了一種針對真實資產&#xff08;RWA&#xff09;產業的聯合曲線激勵模型&#xff0c;將勞動與數據貢獻映射為曲線價值&#xff0c;并基于固定檔位與指數衰減獎勵發放總計 2.1億積分。該模型結合了去中心化定價與平滑遞減機制&#xff0c;不僅為早期貢獻者提供更高…

java安全入門

文章目錄 java基礎知識this變量方法可變參數構造方法繼承的關鍵字protected super阻止繼承方法重載向上轉型和向下轉型多態抽象接口static靜態字段default方法 包final內部類 java序列化與反序列化反射urldns鏈動態代理類加載器&#xff08;ClassLoader&#xff09;雙親委派模型…

前端基礎之《Vue(14)—組件通信(1)》

一、什么是組件通信 1、通信是組件或模塊之間的數據交互。 2、組件多重通信就形成了數據流&#xff0c;數據流管理的優劣決定了產品能否上線&#xff0c;返工是否頻繁的問題。 3、Vue中有哪些常見的通信方案&#xff1f; 組件樹的概念&#xff1a; 在Vue中&#xff0c;組件…

el-row el-col

參考layout布局 Element - The worlds most popular Vue UI frameworkElement&#xff0c;一套為開發者、設計師和產品經理準備的基于 Vue 2.0 的桌面端組件庫https://element.eleme.cn/#/zh-CN/component/layout#row-attributes 一行可以看做24個 Element UI 中的 el-row 是…

Socket-TCP

在TCP/ip協議中&#xff0c;用源IP、源端口號、目的IP、目的端口號、協議號這樣一個五元組來標識一個通信&#xff01; 端口號范圍劃分 0 - 1023: 知名端口號&#xff0c;HTTP&#xff0c;FTP&#xff0c;SSH 等這些廣為使用的應用層協議&#xff0c;他們的端口號都是固定的。…

大數據Spark(五十八):Spark Pi介紹

文章目錄 Spark Pi介紹 Spark Pi介紹 Spark Pi是Apache Spark官方提供的一個示例程序&#xff0c;該案例使用 Spark 進行分布式計算&#xff0c;通過蒙特卡羅方法估算圓周率&#xff08;π&#xff09;的值&#xff0c;其估算π原理如下&#xff1a; 上圖中&#xff0c;正方形…

Doris索引機制全解析,如何用高效索引加速數據分析

在當今大數據時代&#xff0c;企業對于實時數據分析的需求呈現爆發式增長。面對動輒PB級的數據量和秒級響應的業務訴求&#xff0c;傳統數據庫系統往往力不從心。Apache Doris作為新一代MPP分析型數據庫&#xff0c;憑借其獨特的索引機制&#xff0c;在京東、美團等企業的實時數…

基于SpringBoot + Vue 的作業管理系統

產品包含&#xff1a; 項目源碼數據庫文件論文ppt 技術棧 架構: B/S、MVC 系統環境&#xff1a;Windows/Mac 開發環境&#xff1a;IDEA、JDK1.8、Maven、Mysql 技術棧&#xff1a;Java、Mysql、SpringBoot、Mybatis、Vue 功能模塊 用戶模塊&#xff1a;學生用戶、管理員、…

HCL(HashiCorp Configuration Language)是一種結構化配置語言

HCL&#xff08;HashiCorp Configuration Language&#xff09;是一種結構化配置語言&#xff0c;語法簡潔且可讀性強&#xff0c;廣泛用于 Docker Buildx Bake、Terraform、Nomad 等工具的配置。以下是其核心語法規則和示例&#xff1a; 1. 基礎結構 HCL 使用 塊&#xff08;…