0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

算法解題:缺失的最小正整數(shù)

馬哥Linux運維 ? 來源:Python頭條 ? 作者:綜合格豆 ? 2022-12-06 14:33 ? 次閱讀

描述問題

問題:給定一個任意無序的整數(shù)數(shù)組 ,請返回一個在數(shù)組中沒有出現(xiàn)的最小正整數(shù)。

限制:時間復雜度為 ,空間復雜度為 。

示例 1
輸入:nums = [3, 1, 2, 4]
輸出:5
描述:1、2、3、4 都在數(shù)組中,因此 5 是沒有出現(xiàn)在數(shù)組中的最小正整數(shù)。

示例 2
輸入:nums = [-3, 1, 0, 4]
輸出:2
描述:略

示例 3
輸入:nums = [6, 8, 7, 8]
輸出:1
描述:略

請沒做過此題的讀者先思考片刻......

分析問題

第一步:有序數(shù)組

如果要求返回數(shù)組中存在的最小正整數(shù),則很容易。僅遍歷一次,并用一個變量記住當前的最小正整數(shù)即可。但是題目的要求是返回數(shù)組中缺失的最小正整數(shù),這樣我們必須處理無序數(shù)組,使其按照某種方式有序才行。如果數(shù)組有序,則僅需要最多一次遍歷數(shù)組( 次比較)就能完成任務。

說到數(shù)組有序,首先會想到排序算法。處理一般排序的最高效算法就要屬快速排序和歸并排序了。但很遺憾,它們的平均時間復雜度都是 (超出題目的限制)。

還有更高效的排序算法么?當然有啦,正是用于整數(shù)的計數(shù)排序算法。其時間復雜度正為 。但是,計數(shù)排序的空間復雜度要視數(shù)組元素(整數(shù))取值范圍而定,而整數(shù)的范圍區(qū)間已經(jīng)達到了幾十億。這很顯然不能滿足空間復雜度 的限制。

第二步:核心問題

繼續(xù)思考我們會發(fā)現(xiàn)一個重要的問題,也是該題目的核心所在,即缺失最小正整數(shù) 的取值范圍是 。

如果數(shù)組為 [1, 2, 3,..., n-1, n],則 ,此時值最大。

否則,。

這一步是解決整個問題的最關鍵所在,也就是說我們可以將數(shù)組 中的大小在 范圍的元素在長度為 的數(shù)組中進行有序排列。而數(shù)組 的長度剛好為 ,因此我們就可以不必申請額外空間,僅在原數(shù)組上對這些元素進行排序了。

這個排序與計數(shù)排序很類似,只不過不需要在對應的位置上記錄相同元素的個數(shù)。只需將數(shù)組中每個 放到 位置上。我們稱每個滿足 的元素為配位元素。

第三步:實現(xiàn)細節(jié)

遍歷數(shù)組 。

當遍歷到某個索引 時,可能會有下述 3 種情況:

該元素無法在數(shù)組中配位, 或者 。此時無需做任何額外處理,只進行 i++。

d7136ce8-6e62-11ed-8abf-dac502259ad0.pngd725fa48-6e62-11ed-8abf-dac502259ad0.png

與該元素值相同的某個元素已是配位元素, 。此時可能會有下述兩種情況(無論哪種情況,同樣只需進行 i++):

該元素本身就是配位元素,。

d745aa32-6e62-11ed-8abf-dac502259ad0.png

該元素本身是非配位元素,。

d76a8f5a-6e62-11ed-8abf-dac502259ad0.png

除了上述的其他情況:

d78ccd2c-6e62-11ed-8abf-dac502259ad0.png
需要交換配位

此時交換 和 的值,其目的是用當前 的值給 配位。

d7b2a830-6e62-11ed-8abf-dac502259ad0.png
繼續(xù)處理新的 元素

然后,(在 值保持不變的情況下)繼續(xù)根據(jù)上述 3 種情況處理新的 元素。

直到遍歷結束。對數(shù)組 元素的配位已處理完畢。

我們再次從頭開始遍歷數(shù)組 。如果到遇到一個不配位的元素(nums[i] != i+1),則缺失最小正整數(shù)為 ;如果直到遍歷結束也沒有不配位元素,則缺失最小正整數(shù)為 。

實現(xiàn)代碼

deffirstMissingPositive(nums):
n=len(nums)
foriinrange(n):
while1<=?nums[i]?<=?n?and?nums[i]?!=?nums[nums[i]-1]:
????????????nums[nums[i]-1],?nums[i]?=?nums[i],?nums[nums[i]-1]
????for?i?in?range(n):
????????if?nums[i]?!=?i+1:
????????????return?i+1

????return?n+1

復雜度分析

時間復雜度:在 Python 代碼中,看似第 5 行是計算最密集的(嵌套循環(huán)),其所做的處理是交換兩個元素以進行配位。由于數(shù)組的每個索引最多只會進行一次配位,因此此處代碼最多被執(zhí)行 次。另外還有兩個 次 for 循環(huán)。所以該算法的時間復雜度為 。

空間復雜度:由于我們在原數(shù)組 上進行操作,因而沒有額外的空間申請。所以該算法的空間復雜度為 。

總結

雖說本題實現(xiàn)的代碼量并不多,但思考起來卻不算容易。關鍵點就在于要想到使數(shù)組有序缺失最小正整數(shù)的范圍。只要明確這兩點,這個問題就會迎刃而解。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4613

    瀏覽量

    92957
  • 數(shù)組
    +關注

    關注

    1

    文章

    417

    瀏覽量

    25960

原文標題:算法解題:缺失的最小正整數(shù)

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何用LabVIEW,將m隨機分為n個數(shù),且這n個數(shù)的和加起來等于m(所有的數(shù)均為大于零的正整數(shù),m>n)

    如何用abVIEW將一個數(shù)m分為n份,這n份數(shù)加起來,等于m比如一個數(shù)是15,將其分為3份,這三份數(shù)為:6,2,76+2+7=15(即m=15,n=3的情況)分成的n份數(shù),都是大于零的正整數(shù)或者有什么思路可以提供一下嗎
    發(fā)表于 07-30 17:12

    正整數(shù)的連續(xù)奇偶拆分

    正整數(shù)n的一個拆分是指將n表示為一個或多個正整數(shù)的無序和。n的不同拆分方式數(shù)稱為n的拆分數(shù)。給出了一個正整數(shù)n能拆分成連續(xù)奇數(shù)和連續(xù)偶數(shù)之和的充要條件,并求出了這兩種
    發(fā)表于 05-28 11:22 ?11次下載

    按頻率抽取的FFT算法

    按頻率抽取的FFT算法一、算法原理設輸入序列長度為N=2M(M為正整數(shù),將該序列的頻域的輸出序列X(k)(也是M點序列,按其頻域順序的奇偶分解為越來越短的子序列,稱為基2按頻
    發(fā)表于 07-25 11:44 ?62次下載

    能見度與缺失分析的改進PageRank算法

    本文在對PageRank 進行分析的基礎上,提出了基于鏈接能見度和缺失分析的改進PageRank算法,該算法根據(jù)鏈接不同特性賦予它不同的點擊概率,同時分析了缺失率產(chǎn)生的原因并提出相關
    發(fā)表于 12-29 16:57 ?11次下載

    用C語言寫的100行DES加密算法

    // Type—ENCRYPT:加密,DECRYPT:解密// 輸出緩沖區(qū)(Out)的長度 >= ((datalen+7)/8)*8,即比datalen大的且是8的倍數(shù)的最小正整數(shù)// In 可以= Out,此時加/解密后將覆蓋輸入緩沖區(qū)(In)的內(nèi)容/
    發(fā)表于 02-09 11:23 ?68次下載

    超長正整數(shù)的加法源代碼

    超長正整數(shù)的加法源代碼方法一:#include#include#includetypedef
    發(fā)表于 02-09 15:59 ?13次下載

    基于整數(shù)變換的數(shù)據(jù)隱藏新算法

    基于Harr小波變換(整數(shù)變換),提出了一種新型的差值擴展數(shù)據(jù)隱藏算法,傳統(tǒng)的Tian算法遇到的問題是二重嵌入中用于變換的差值大幅減少,嵌入容量受到了很大制約,并且在固定
    發(fā)表于 12-23 16:00 ?0次下載

    基于最小和高效LDPC譯碼算法

    針對低密度奇偶校驗(LDPC)譯碼算法性能低的問題,提出一種基于最小和的高效譯碼算法。該算法從概率的角度分析消息的傳遞過程中校驗節(jié)點的更新過程,得到近似的
    發(fā)表于 05-18 18:54 ?0次下載
    基于<b class='flag-5'>最小</b>和高效LDPC譯碼<b class='flag-5'>算法</b>

    C語言教程之輸出相對的最小整數(shù)

    C語言教程之輸出相對的最小整數(shù),很好的C語言資料,快來學習吧。
    發(fā)表于 04-22 17:45 ?0次下載

    C語言教程之相對的最小整數(shù)

    C語言教程之相對的最小整數(shù),很好的C語言資料,快來學習吧。
    發(fā)表于 04-25 16:09 ?0次下載

    基于整數(shù)小波變換的魯棒零水印算法

    基于整數(shù)小波變換的魯棒零水印算法_曾文權
    發(fā)表于 01-03 15:24 ?0次下載

    rsa加密算法的安全性分析

    RSA算法是一個基于初等數(shù)論定理的公鑰密碼體制加密算法,它的實現(xiàn)過程為:選取2個大素數(shù)p與q,然后算出n=pq,φ(n)=n-p-q+1,再選取一個正整數(shù)e,使之滿足(e,φ(n))=1,1《E《Φ(N);再求出
    發(fā)表于 12-10 11:59 ?2.4w次閱讀

    基于距離最大化和缺失數(shù)據(jù)聚類的填充算法

    通過對基于K-means聚類的缺失值填充算法的改進,文中提出了基于距離最大化和缺失數(shù)據(jù)聚類的填充算法。首先,針對原填充算法需要提前輸入聚類個
    發(fā)表于 01-09 10:56 ?0次下載
    基于距離最大化和<b class='flag-5'>缺失</b>數(shù)據(jù)聚類的填充<b class='flag-5'>算法</b>

    基于加性噪聲的缺失數(shù)據(jù)因果推斷

    推斷數(shù)據(jù)間存在的因果關系是很多科學領域中的一個基礎問題,然而現(xiàn)在暫時還沒有快速有效的方法對缺失數(shù)據(jù)進行因果推斷。為此,提出一種基于加性噪聲模型下適應缺失數(shù)據(jù)的因果推斷算法。該算法是基于
    發(fā)表于 01-14 16:06 ?0次下載

    非線性整數(shù)規(guī)劃的遺傳算法及MATLAB程序下載

    非線性整數(shù)規(guī)劃的遺傳算法及MATLAB程序下載
    發(fā)表于 06-15 10:55 ?12次下載