在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

算法解題:缺失的最小正整數

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

描述問題

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

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

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

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

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

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

分析問題

第一步:有序數組

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

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

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

第二步:核心問題

繼續思考我們會發現一個重要的問題,也是該題目的核心所在,即缺失最小正整數 的取值范圍是 。

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

否則,。

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

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

第三步:實現細節

遍歷數組 。

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

該元素無法在數組中配位, 或者 。此時無需做任何額外處理,只進行 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
繼續處理新的 元素

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

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

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

實現代碼

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 行是計算最密集的(嵌套循環),其所做的處理是交換兩個元素以進行配位。由于數組的每個索引最多只會進行一次配位,因此此處代碼最多被執行 次。另外還有兩個 次 for 循環。所以該算法的時間復雜度為 。

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

總結

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

審核編輯:湯梓紅

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

    關注

    23

    文章

    4626

    瀏覽量

    93161
  • 數組
    +關注

    關注

    1

    文章

    417

    瀏覽量

    25997

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

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

收藏 人收藏

    評論

    相關推薦

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

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

    正整數的連續奇偶拆分

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

    按頻率抽取的FFT算法

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

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

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

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

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

    超長正整數的加法源代碼

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

    基于整數變換的數據隱藏新算法

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

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

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

    C語言教程之輸出相對的最小整數

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

    C語言教程之相對的最小整數

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

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

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

    rsa加密算法的安全性分析

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

    基于距離最大化和缺失數據聚類的填充算法

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

    基于加性噪聲的缺失數據因果推斷

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

    非線性整數規劃的遺傳算法及MATLAB程序下載

    非線性整數規劃的遺傳算法及MATLAB程序下載
    發表于 06-15 10:55 ?12次下載
    主站蜘蛛池模板: 人人看人人添人人爽| 噜噜噜噜天天狠狠| 一区二区三区欧美在线| 一级毛片一级黄片| 四虎永久免费地址在线网站| 四虎欧美在线观看免费| 日本一卡二卡≡卡四卡精品| 欧洲成品大片在线播放| 久久瑟| 俺去啦最新网址| 天天色天天射天天操| 国产亚洲欧美成人久久片| 日本69xxxx| 美女和帅哥在床上玩的不可描述| 伊人久久亚洲综合天堂| 日韩三级在线免费观看| 黄色四虎影院| 午夜神马福利影院| 狠狠干欧美| 亚洲男人天堂2020| 羞羞爱爱| 理论片人人51| 午夜精品一区二区三区在线观看 | 性欧美一级| 日本成人黄色网址| 国产国产人免费人成免费视频| 午夜免费福利网站| 1024手机看片欧美日韩| 最新天堂| 女色专区| 午夜亚洲国产精品福利| 51午夜| 在线免费观看色视频| 欧美日韩国产乱了伦| 8050午夜一级二级全黄| 国产狂喷冒白浆免费视频| 色爱区综合五月激情| 日韩免费高清一级毛片在线| 高清一级做a爱免费视| 狠狠夜夜| 中文一级黄色片|