Leetcode 41:缺失的第一個正數(最詳細的解法!!!)
阿新 • • 發佈:2018-12-15
給定一個未排序的整數陣列,找出其中沒有出現的最小的正整數。
示例 1:
輸入: [1,2,0]
輸出: 3
示例 2:
輸入: [3,4,-1,1]
輸出: 2
示例 3:
輸入: [7,8,9,11,12]
輸出: 1
說明:
你的演算法的時間複雜度應為O(n),並且只能使用常數級別的空間。
解題思路
我們首先想到的做法是對nums
排序,然後遍歷[min(nums),max(nums)]
區間內的所有數,找到第一個不在nums
中的正整數即可。
class Solution:
def firstMissingPositive(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if not nums:
return 1
nums.sort()
for i in range(1, nums[-1]+1):
if i not in nums:
return i
return nums[-1] + 1
但是問題中說了只能是O(n)
級別的演算法,所以我們不能使用排序演算法。而且演算法又是O(n)
級別,所以我們很容易猜到做法就是通過遍歷一遍陣列就可以得到答案。但是要怎麼做呢?我們首先想到的做法是這樣,我們先定義一個很大的陣列mem
nums
中的每個元素num
,對mem[num]=1
,這樣我們只要再次遍歷mem
,找到第一個mem[i]==0
的元素,那麼i
就是我們要找的值。很不錯的想法是不是?但是我們這裡還有一個問題,這個陣列要定義多大呢?max(nums)+1
即可。
class Solution:
def firstMissingPositive(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if not nums:
return 1
max_len = max(nums)+1
mem = [0]*max_len
mem[0] = 1
for num in nums:
if num > 0:
mem[num] = 1
for i, val in enumerate(mem):
if val != 1:
return i
return max_len
這種解法我認為是目前leetcode
上的最佳解法。
如有問題,希望大家指出!!!