求缺失的第乙個正數
給定乙個未排序的整數陣列,找出其中沒有出現的最小的正整數。
示例 1:
輸入: [1,2,0]
輸出: 3
示例 2:
輸入: [3,4,-1,1]
輸出: 2
示例 3:
輸入: [7,8,9,11,12]
輸出: 1
說明:你的演算法的時間複雜度應為o(n),並且只能使用常數級別的空間。
思路:
盡可能地把陣列中不大於n(n為陣列長度)的正整數放置到下標+1與其數值相同的位置上
第乙個下標+1與數值不同的數字,即為所求。
例如陣列nums = [3,4,-1,1],調整位置後的結果為:[1,-1,3,4]
除第二個數字外,其餘數字均滿足nums[i] = i + 1,因此返回2
class
solution
:def
firstmissingpositive
(self, nums)
:"""
:type nums: list[int]
:rtype: int
"""#第乙個迴圈去遍歷nums裡的每乙個元素
for i in
range
(len
(nums)):
#如果當前這個數字在我們能夠進行轉移的範圍內if0
< nums[i]
and nums[i]
<
len(nums)
:# if nums[i] != nums[nums[i]-1]:
#如果當前這個位置上的數字與它的index對應不上的話,我們會把它放到他應該在的正確的位置上去
#同時為了保證陣列元素資訊不丟失,那個正確位置上的資訊我們也要拿過來。
while nums[i]
!= i +1:
nums[nums[i]-1
], nums[i]
= nums[i]
, nums[nums[i]-1
]#一旦換完後當前位置i上的元素出現以下任意一種情況都說明我們不用再換了
if nums[i]
<=
0or nums[i]
>=
len(nums)
or nums[i]
==nums[nums[i]-1
]:break
#上一段**在幹的事情就是我們讓大於0小於len(nums)的元素全部到對應的位置上去
#比如nums為[1,3,-1,5,2],那麼經過上面之後就變成[1,2,3,-1,5],能夠對應上的數字全部已經正確排序,缺陷的(-1)的index+1就是缺失的第乙個正數。
jet =
1#再次遍歷陣列
#jet是乙個識別符號,用來標誌我們找沒找到不符合的項
for i in
range
(len
(nums)):
#找到的第乙個大小與index不符的項,我們的答案就已經產生,就是當前index+1
if nums[i]
!= i +1:
jet =
0 ans = i +
1break
#如果陣列是[1,2,3]這種,每一項都符合,則缺失的是4,也就是len(nums) + 1
if jet ==1:
ans =
len(nums)+1
return ans
LeetCode 缺失的第乙個正數
給定乙個未排序的整數陣列,找出其中沒有出現的最小的正整數。示例 1 輸入 1,2,0 輸出 3 示例 2 輸入 3,4,1,1 輸出 2 示例 3 輸入 7,8,9,11,12 輸出 1 說明 你的演算法的時間複雜度應為o n 並且只能使用常數級別的空間。思路分析 解此題需要在序列中確定缺失的最小的...
第乙個缺失的正整數 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實戰 缺失的第乙個正數
given an unsorted integer array,find the smallest missing positive integer.example 1 input 1 2,0 output 3example 2 input 3 4,1,1 output 2example 3 inp...