Leetcode 求缺失的第乙個正數

2021-09-10 14:48:26 字數 1779 閱讀 3397

求缺失的第乙個正數

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

示例 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...