We love coding - #4

更新於 發佈於 閱讀時間約 3 分鐘
Hi. I'm coding dog.
Let's solve today's coding interview problem.
Q: 給定一個整數陣列,請在線性時間和常數空間中找到第一個遺失的正整數。換句話說,找到陣列中不存在的最小正整數。陣列也可以包含重複項和負數。

A: 為了找到給定陣列中不存在的最小正整數,我們可以使用一個修改版的計數排序演算法,步驟如下:
  1. 首先,我們遍歷整個陣列,忽略所有負數和零,因為它們不能是答案。
  2. 對於所有剩下的正整數,我們在一個單獨的布爾陣列中標記它們的存在,稱為 present[]。具體來說,如果 A[i] 是一個正整數且存在於陣列中,則我們將 present[A[i]] 設為 true。
  3. 最後,我們從索引 1 開始遍歷 present[] 陣列,直到找到第一個索引 i,使得 present[i] 為 false。這就是陣列中缺失的最小正整數。
以下是該演算法的 Python 代碼:
def find_first_missing_positive_integer(A):
    n = len(A)
    present = [False] * (n+1) # 創建布爾陣列來標記正整數的存在
    
    # 標記正整數的存在
    for i in range(n):
        if A[i] > 0 and A[i] <= n:
            present[A[i]] = True
    
    # 找到第一個遺失的正整數
    for i in range(1, n+1):
        if not present[i]:
            return i
    
    # 如果所有正整數都存在,則返回下一個整數
    return n+1
上述演算法的時間複雜度為 O(n),空間複雜度為 O(n)(用於布爾陣列 present[])。然而,由於輸入陣列是一個整數陣列,我們可以將空間複雜度優化為 O(1),方法是使用輸入陣列本身作為布爾陣列。我們可以通過取負來標記正整數的存在。具體來說,如果 A[i] 是一個正整數,則我們將索引 A[i]-1 的值取負(因為陣列索引從 0 開始,而正整數從 1 開始)。以下是優化後的 Python 代碼:
def find_first_missing_positive_integer(A):
    n = len(A)
    
    # mark positive integers
    for i in range(n):
        if A[i] > 0 and A[i] <= n:
            j = A[i] - 1
            if A[j] > 0:
                A[j] *= -1
    
    # find first missing positive integer
    for i in range(n):
        if A[i] > 0:
            return i+1
    
    # if all positive integers are present, return next integer
    return n+1
avatar-img
1會員
4內容數
Solve a coding interview problem everyday.
留言
avatar-img
留言分享你的想法!

































































你可能也想看
Google News 追蹤
Thumbnail
川普2.0的關稅與貿易政策,表面看似反覆無常,實則圍繞著幾個核心目標:扭轉貿易不公、推動美國再工業化、確保戰略自主,以及貫徹「美國優先」原則。本文深入剖析其背後的一致性邏輯、長期戰略意義,以及對全球產業鏈的影響,並探討不同產業的贏家與輸家。
Thumbnail
The Bruno Mathsson Prize 40 Years 展覽,顧名思義,就是源自家具設計師兼建築師布魯諾·馬特松 (Bruno Mathsson,1907-88 年) 所創造的獎項而設。但 Bruno 是誰?
在檢查列表中含有tuple的座標點時,若要給其他演算法做運算時若有其中有tuple有空值時,就會報錯。 本文主要介紹兩種方法可以檢查是否有空值 程式範例1 positon_list =[(42,123),(None,None),(22,11)] for cord in positon_lis
Thumbnail
今天分享的繪本 “Clifford, We Love You” (Norman Bridwell),是融合歌曲在朗讀裡,旋律超級洗腦,和小朋友共讀完後,他們還會不自覺地哼唱。
Thumbnail
題目敘述 Distinct Subsequences 給定一個字串s和目標t,請問有多少個s的子序列可以完美匹配目標t ? 也就是說,有多少個s的子序列和目標t相等? 測試範例 Input: s = "rabbbit", t = "rabbit" Output: 3
Thumbnail
她們有時很率性,她們有時也很脆弱。Goro的編曲,Wyman的文字,恰似是COLLAR的強心針,更是一種催化劑,讓這七位女生之間的凝聚力,大得連拖拉機也拉不開。
Thumbnail
[Verse 1] I didn't think you'd understand me 我沒想到你會理解我 How could you ever even try? 你怎麼會試著理解呢? I don't wanna tiptoe but I don't wanna hide 我不想偷偷
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
題目敘述 題目給定我們一個輸入陣列nums 要求我們以正、負交叉排列的方式重組陣列,並且必須保持原本的相對順序。 並且以陣列的形式輸出返回答案。 例[5, 1, -2, -3] 重排後為 [5, -2, 1, -3] 題目的原文敘述 測試範例 Example 1: Input:
Thumbnail
題目敘述 題目的情境是設計並且實現一個包含所有正整數的數據流,以set集合的方式存在。 數據流 = {1, 2, 3, 4, ..., ∞} 要求我們去實現定義好的function介面: SmallestInfiniteSet()建構子,初始化這個包含所有正整數的數據流。 int po
Thumbnail
川普2.0的關稅與貿易政策,表面看似反覆無常,實則圍繞著幾個核心目標:扭轉貿易不公、推動美國再工業化、確保戰略自主,以及貫徹「美國優先」原則。本文深入剖析其背後的一致性邏輯、長期戰略意義,以及對全球產業鏈的影響,並探討不同產業的贏家與輸家。
Thumbnail
The Bruno Mathsson Prize 40 Years 展覽,顧名思義,就是源自家具設計師兼建築師布魯諾·馬特松 (Bruno Mathsson,1907-88 年) 所創造的獎項而設。但 Bruno 是誰?
在檢查列表中含有tuple的座標點時,若要給其他演算法做運算時若有其中有tuple有空值時,就會報錯。 本文主要介紹兩種方法可以檢查是否有空值 程式範例1 positon_list =[(42,123),(None,None),(22,11)] for cord in positon_lis
Thumbnail
今天分享的繪本 “Clifford, We Love You” (Norman Bridwell),是融合歌曲在朗讀裡,旋律超級洗腦,和小朋友共讀完後,他們還會不自覺地哼唱。
Thumbnail
題目敘述 Distinct Subsequences 給定一個字串s和目標t,請問有多少個s的子序列可以完美匹配目標t ? 也就是說,有多少個s的子序列和目標t相等? 測試範例 Input: s = "rabbbit", t = "rabbit" Output: 3
Thumbnail
她們有時很率性,她們有時也很脆弱。Goro的編曲,Wyman的文字,恰似是COLLAR的強心針,更是一種催化劑,讓這七位女生之間的凝聚力,大得連拖拉機也拉不開。
Thumbnail
[Verse 1] I didn't think you'd understand me 我沒想到你會理解我 How could you ever even try? 你怎麼會試著理解呢? I don't wanna tiptoe but I don't wanna hide 我不想偷偷
Thumbnail
題目會給定一個陣列nums和一個目標值goal。計算子陣列總和=goal的數目有多少。演算法包含前綴和和字典的技巧,時間複雜度為O(n),空間複雜度為O(n)。
Thumbnail
題目敘述 題目給定我們一個輸入陣列nums 要求我們以正、負交叉排列的方式重組陣列,並且必須保持原本的相對順序。 並且以陣列的形式輸出返回答案。 例[5, 1, -2, -3] 重排後為 [5, -2, 1, -3] 題目的原文敘述 測試範例 Example 1: Input:
Thumbnail
題目敘述 題目的情境是設計並且實現一個包含所有正整數的數據流,以set集合的方式存在。 數據流 = {1, 2, 3, 4, ..., ∞} 要求我們去實現定義好的function介面: SmallestInfiniteSet()建構子,初始化這個包含所有正整數的數據流。 int po