LeetCode 缺失的第乙個正數

2021-09-10 15:09:42 字數 2056 閱讀 5475

給定乙個未排序的整數陣列,找出其中沒有出現的最小的正整數。

示例 1:

輸入: [1,2,0]

輸出: 3

示例 2:

輸入: [3,4,-1,1]

輸出: 2

示例 3:

輸入: [7,8,9,11,12]

輸出: 1

說明:

你的演算法的時間複雜度應為o(n),並且只能使用常數級別的空間。

思路分析:解此題需要在序列中確定缺失的最小的正整數,我想到了兩種方法,

第一種是利用關聯容器map將出現的正數與其出現的次數進行關聯,然後用for從1到+無窮進行判斷存在性,時間複雜度為o(n),時間複雜度為o(n),(超出了題目的限制。。。);

第二種是將nums容器利用演算法庫中sort演算法進行排序,然後找出第乙個最小的正數的位置,最後用for從1到+無窮進行判斷存在性,時間複雜度為o(log n)最差的情況也會達到o(n),空間複雜度為常數。

下面將給出第二種,排序+for 的演算法實現。

int

firstmissingpositive

(vector<

int>

& nums)

sort

(nums.

begin()

, nums.

end())

;int index =-1

;while

(index +

1< numssize && nums[index +1]

<=0)

index +=1;

//定位到第乙個正數的位置

這道題演算法存在缺陷,請思考一下!

我們先將不通過的示例進行排序,然後模擬執行。

所以問題在於for迴圈中index的自增未解決nums容器中的重複元素的問題。

修改之後的**:

class

solution

sort

(nums.

begin()

, nums.

end())

;//排序,方便後期尋找

int index =-1

;while

(index +

1< numssize && nums[index +1]

<=0)

index +=1;

//定位到第乙個正數的位置

雖然是挺快的,但是此演算法會帶來一些***,比如在排序的時候,將會改變原容器nums的順序。

對於第一種演算法出現的空間超限問題,可以將map容器修改為乙個比較大的常數級別的陣列,採取計數排序的策略進行優化。

class

solution

;//用於標記i是否存在

for(

int i =

0; i < numssize; i++)if

(nums[i]

>0)

//正數進行標記

flag[nums[i]]=

true

;int index =1;

while

(flag[index]

)return index;}}

;

leetcode習題集 41 缺失的第乙個正數

給定乙個未排序的整數陣列,找出其中沒有出現的最小的正整數。示例 1 輸入 1,2,0 輸出 3 示例 2 輸入 3,4,1,1 輸出 2 示例 3 輸入 7,8,9,11,12 輸出 1 public class p41 firstmissingpositive2 for int i 0 i num...

第乙個缺失的正整數 leetcode

為什麼不能nums這樣賦值呢?nums nums i nums i 呢 例如 如果陣列中存在3 那麼我們可不可以nums 3 3呢?這樣最後的結果會不會和 0,1,2,3,4,5 嗎?然後對這個陣列從1開始遍歷不就好了嗎這樣做事不行的,因為 1,2,3,0 這樣最後的結果就是 1,1,0,3 因為值...

Leetcode 求缺失的第乙個正數

求缺失的第乙個正數 給定乙個未排序的整數陣列,找出其中沒有出現的最小的正整數。示例 1 輸入 1,2,0 輸出 3 示例 2 輸入 3,4,1,1 輸出 2 示例 3 輸入 7,8,9,11,12 輸出 1 說明 你的演算法的時間複雜度應為o n 並且只能使用常數級別的空間。思路 盡可能地把陣列中不...