給定乙個未排序的整數陣列,找出其中沒有出現的最小的正整數。
示例 1:
示例 2:輸入: [1,2,0]
輸出: 3
示例 3:輸入: [3,4,-1,1]
輸出: 2
說明:輸入: [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 並且只能使用常數級別的空間。思路 盡可能地把陣列中不...