缺失的第一個正整數

繼續每日一題

今天給大家帶來一道將數組視為哈希表的算法

題目描述:

給你一個未排序的整數數組 nums ,請你找出其中沒有出現的最小的正整數。
請你實現時間復雜度為 O(n) 并且只使用常數級別額外空間的解決方案。

題目示例:
在這里插入圖片描述

由于題目要求我們「只能使用常數級別的空間」,而要找的數一定在 [1, N + 1] 左閉右閉(這里 N 是數組的長度)這個區間里。因此,我們可以就把原始的數組當做哈希表來使用。事實上,哈希表其實本身也是一個數組;

最小正整數從1開始,那么沒有出現的最小正整數一定在1到n+1之間(因為如果1到n都出現了,那么答案就是n+1)

所以我們可以只考慮數組中的1到n之間的數,負數、0和大于n的數可以忽略(因為它們不影響1到n之間的最小缺失正整數)。

考慮到對時間和空間復雜度的要求,我們可以采用原地置換,具體流程通過文字描述不太直觀,下面通過一個case給大家描述一下:

數組 [3,4,-1,1]

  • i=0,nums[0]=3,它應該在位置2(即下標2),交換nums[0]和nums[2]:得到[-1,4,3,1]
    然后i=0,此時nums[0]=-1,不在1到4范圍內,跳過。

  • i=1,nums[1]=4,它應該在位置3,交換nums[1]和nums[3]:得到[-1,1,3,4]
    然后i=1,此時nums[1]=1,它應該在位置0,但是位置0是-1,交換:得到[1,-1,3,4]
    然后i=1,現在nums[1]=-1,跳過。

  • i=2,nums[2]=3,在位置2(正確),跳過。

  • i=3,nums[3]=4,在位置3(正確),跳過。

然后遍歷數組

  • i=0,num[0]=1(正確);
  • i=1,num[1]=-1,但實際上i=1,對應的數是2,所以返回i+1

但是在置換過程中可能會存在當前位置和要置換的位置的數值是相同的,導致死循環,所以在置換之前還需要比較兩個值是否相同

核心邏輯如下:

  • 當前元素:currentVal=nums[i]
  • 當前元素需要在的位置:index=currentVal - 1,因為數組下標從0開始,所以需要減一
  • 要置換的元素:nums[index]
while (true) {int currentVal = nums[i];//當前元素需要置換到該位置,數組下標從0開始,所以需要減一int changeIndex = currentVal - 1;int needChangeVal = nums[changeIndex];if (currentVal < 1 || currentVal > n) {//不在有效范圍無需置換break;}int needChangeVal = nums[changeIndex];if (currentVal == needChangeVal) {//兩個數字相等,無需置換break;}nums[i] = needChangeVal;nums[changeIndex] = currentVal;}

完整代碼如下:

    public static int firstMissingPositive(int[] nums) {int n = nums.length;for (int i = 0; i < n; i++) {while (true) {int currentVal = nums[i];//當前元素需要置換到該位置,數組下標從0開始,所以需要減一int changeIndex = currentVal - 1;if (currentVal < 1 || currentVal > n) {//不在有效范圍無需置換break;}int needChangeVal = nums[changeIndex];if (currentVal == needChangeVal) {//兩個數字相等,無需置換break;}nums[i] = needChangeVal;nums[changeIndex] = currentVal;}}for (int i = 0; i < n; i++) {int currentVal = nums[i];if (currentVal != i + 1) {return i + 1;}}//如果都存在則返回 n+1return n + 1;}

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

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

相關文章

單例模式-Python示例

單例模式 單例模式&#xff08;Singleton Pattern&#xff09;是設計模式中一種創建型模式&#xff0c;廣泛應用于軟件開發中。一以下以故事化的方式&#xff0c;結合詳細的技術講解&#xff0c;介紹單例模式的背景、定義、適用場景&#xff0c;并提供python的示例代碼。 故事…

啥是 SaaS

https://www.youtube.com/watch?vnpcL7oRZQlI這個視頻講了什么東西&#xff0c; 什么 idea?好的&#xff0c;這個視頻內容非常棒&#xff0c;信息量很足。下面為你詳細總結視頻講了什么&#xff0c;以及核心的 Idea 是什么。 視頻核心 Idea 這個視頻講的是一位名叫 Leandro…

Spring Boot 工程啟動以后,我希望將數據庫中已有的固定內容,打入到 Redis 緩存中,請問如何處理?

在 Spring Boot 工程中&#xff0c;將數據庫中的固定內容預先加載到 Redis 緩存中可以通過以下步驟實現。這里假設你已經配置好了 Spring Data Redis 和數據庫&#xff08;如 MySQL&#xff09;的連接。 1. 添加依賴 首先&#xff0c;確保你的 pom.xml&#xff08;Maven&…

springboot企業級項目開發之項目測試——集成測試!

集成測試 集成測試是指項目代碼在單元測試完成后進行的第二階段測試。集成測試的重點是在集成組件或單元之間交互時暴露缺陷&#xff0c;以保證不同模塊之間相互調用的正確性。在Spring Boot的項目集成測試中&#xff0c;將測試Controller和Dao的完整請求處理。應用程序在服務…

HTML 媒體(Media)

HTML 媒體&#xff08;Media&#xff09; 引言 HTML 媒體元素是構成現代網頁的重要組成部分&#xff0c;它允許我們在網頁中嵌入各種類型的媒體內容&#xff0c;如音頻、視頻、圖像等。這些元素不僅豐富了網頁的視覺效果&#xff0c;還提升了用戶體驗。本文將詳細介紹 HTML 媒…

輕量化分布式AGI架構:基于區塊鏈構建終端神經元節點的互聯網智腦

一、架構概述 該架構通過將終端設備&#xff08;如手機、IoT設備&#xff09;轉化為神經元節點&#xff0c;結合區塊鏈技術構建去中心化智能網絡&#xff0c;形成“互聯網智腦”。其核心在于突破傳統AGI算力瓶頸&#xff0c;實現數據安全共享與價值分配。 1.1 關鍵特征 分布…

【知識圖譜構建系列6】:借了張顯卡先跑著

文章目錄 前情提要mistral模型運行代碼前情提要 之前咱對LLM4KGC的代碼稍作修改,目標是用modelscope來下載模型。 現在這個代碼終于能跑了。 前面咱說,我們的顯卡只有6G的顯存。現在呢,我也成功借到了A100的顯卡。這下,咱可以先跑跑這個項目默認帶的mistral模型。 mist…

從零開始手寫redis(16)實現漸進式 rehash map

手寫 Redis 系列 java從零手寫實現redis&#xff08;一&#xff09;如何實現固定大小的緩存&#xff1f; java從零手寫實現redis&#xff08;三&#xff09;redis expire 過期原理 java從零手寫實現redis&#xff08;三&#xff09;內存數據如何重啟不丟失&#xff1f; jav…

List、Queue、Deque、Stack常用方法總結

Java 中幾個常見的線性數據結構的 方法總結與對比&#xff0c;包括&#xff1a; List&#xff08;ArrayList、LinkedList&#xff09;Queue&#xff08;LinkedList、PriorityQueue&#xff09;Deque&#xff08;ArrayDeque、LinkedList&#xff09;Stack&#xff08;傳統 Stac…

github為InfiniSynapse Docker提PR過程留檔@Windows10

為InfiniSynapse Docker提了一個PR&#xff1a;修改阿里源為清華源&#xff0c;并不再安裝PPA。 by skywalk163 Pull Request #1 chaozwn/infini_docker 整體操作 提PR的前置動作 先fork要提PR的項目git clone到本地用VSCode修改代碼 提交PR git add . git commit -m &…

搭建加解密網站遇到的問題

本機向云服務器傳輸文件 用winscp 服務器在安裝 SSH 服務時自動生成密鑰對&#xff08;公鑰私鑰&#xff09; 為什么要有指紋驗證&#xff1f; 防止中間人攻擊&#xff08;Man-in-the-Middle&#xff09; 指紋驗證打破這個攻擊鏈&#xff1a; 小問題 安裝python時 ./confi…

Docker高級管理--容器通信技術與數據持久化

第一節&#xff1a;容器通信技術 一&#xff1a;Docker 容器的網絡模式 當項目大規模使用 Docker 時&#xff0c;容器通信的問題也就產生了。要解決容器通信問題&#xff0c;必須先了解很多關于網絡的知識。Docker 的網絡模式非常豐富&#xff0c;可以滿足不同容器的通信要求&…

jsons.top工具之數組交集、去重

作為一名程序員&#xff0c;一款高效的 在線轉換工具 &#xff08;在線時間戳轉換 計算器 字節單位轉換 json格式化&#xff09;必不可少&#xff01;https://jsons.top 用js實現一個輕量級的集合運算工具&#xff0c;可以對數組、集合去重、求交并差集&#xff0c;找出兩個集…

Vue3 + Tailwind CSS 后臺管理系統教程

Vue3 搭配 Tailwind CSS 是構建現代后臺管理系統的絕佳組合。Vue3 提供了高效的響應式框架&#xff0c;而 Tailwind CSS 則讓樣式編寫變得快速且靈活。下面我將分步驟教你如何創建一個功能完整的后臺管理系統。 第 1 步&#xff1a;創建項目 首先&#xff0c;我們需要使用 Vit…

ComfyUI遭“Pickai“C++后門攻擊,全球700余臺AI圖像生成服務器淪陷

大規模AI基礎設施遭遇定向攻擊 網絡安全研究機構XLab近日發現針對ComfyUI框架的活躍攻擊活動。ComfyUI是當前廣泛用于部署大型AI圖像生成模型的開源框架。攻擊者通過該框架漏洞植入名為Pickai的C后門程序&#xff0c;已導致全球近700臺服務器失陷。中國國家網絡安全通報中心于…

Unity_VR_如何用鍵鼠模擬VR輸入_PICO項目配置

文章目錄 [TOC] 一、創建項目1.直接創建VR核心模板&#xff08;簡單&#xff09;2.創建3D核心模板導入XR包&#xff08;并配置pico&#xff09;&#xff08;1&#xff09;創建項目&#xff08;2&#xff09;導入PICO的SDK&#xff08;3&#xff09;啟用 PICO XR 插件&#xff0…

站點天下--網站在線和SSL過期監控的可靠助手

簡介 網站突然訪問不了、HTTPS證書到期&#xff0c;如果不能及時發現&#xff0c;將蒙受損失~ 站點天下提供應用在線狀態監控和SSL證書到期監控&#xff1a; 若訪問不了或SSL證書即將到期&#xff0c;則立即發郵件通知&#xff01;可以在線查看應用的在線狀態和SSL證書到期時…

React setState原理

異步更新 原因 1設置為異步提升性能 如果setState每次調用直接執行&#xff0c;會造成 render 函數被頻繁執行 &#xff0c;頁面重新被渲染 解決&#xff1a;異步批處理 2如果render函數未執行時&#xff0c;保證props和state一致性 拿到最新state的方法 法一:setState&…

漢代大模型:歷史鏡像與智能重構的深度對話

引言&#xff1a;當歷史遇見人工智能 一件漢代陶俑的三維模型正通過增強現實技術向觀眾演繹農耕場景。這個看似尋常的文物活化案例&#xff0c;實則蘊含著人工智能與歷史學交叉領域的前沿探索——漢代大模型。作為連接過去與未來的智能載體&#xff0c;漢代大模型不僅重構了我…

es向量檢索里的efSearchc參數是干嘛用的

在Elasticsearch的向量檢索中&#xff0c;ef_search&#xff08;或efSearch&#xff09;是控制HNSW近似最近鄰&#xff08;ANN&#xff09;搜索精度與性能平衡的關鍵參數&#xff0c;其作用機制和影響如下&#xff1a; &#x1f6e0;? 一、核心作用 ef_search 限制底層圖遍歷…