題目:給你一個未排序的整數數組,請你找出其中沒有出現的最小的正整數。你的算法的時間復雜度應為O(n),並且只能使用常數級別的額外空間。
思路:第一個思路是創建一個錨點,這個錨點表示第一個正整數的出現的位置,然后再分情況來判斷,結果程序無法通過所有的測試用例,第一個思路方法以后再實現,后來使用HashMap來說實現,十分方便。
程序1:HashMap
class Solution:
def firstMissingPositive(self, nums: List[int]) -> int:
length = len(nums)
hashmap = [0] * length
for x in nums:
if x > 0 and x <= length:
hashmap[x - 1] = x
for index in range(length):
if hashmap[index] != index + 1:
return index + 1
return length + 1
程序2:類似專家系統(此程序有問題,待修正)
class Solution:
def firstMissingPositive(self, nums: List[int]) -> int:
nums.sort()
length = len(nums)
if length <= 0:
return 1
if length == 1:
if nums[0] <= 0:
return 1
elif nums[0] == 1:
return 2
else:
return 1
#Find the first positive integer as anchor
for index in range(length):
if nums[index] > 0:
anchor = index
break
else:
anchor = length - 1
#temp_index is the first anchor
#anchor in the head
if anchor == 0:
if nums[anchor] == 1:
while anchor < length:
#anchor += 1
if nums[anchor] - nums[anchor - 1] > 1:
return nums[anchor - 1] + 1
break
elif nums[anchor] - nums[anchor - 1] == 1 and anchor - 1 < length:
anchor += 1
elif nums[anchor] - nums[anchor - 1] == 0 and anchor - 1 < length:
anchor += 1
if anchor >= length - 1:
anchor = length - 1
return nums[anchor] + 1
break
else:
return 1
#anchor in the tail
elif anchor == length - 1:
if nums[anchor] < 1:
return 1
elif nums[anchor] > 1:
return 1
else:
return nums[anchor] + 1
#anchor in the body
else:
while anchor < length:
anchor += 1
if nums[anchor] - nums[anchor - 1] > 1:
return nums[anchor - 1] + 1
break
elif nums[anchor] - nums[anchor - 1] == 1 and anchor + 2 < length:
anchor += 1
elif nums[anchor] - nums[anchor - 1] == 0 and anchor + 2 < length:
anchor += 1
if anchor >= length - 1:
anchor = length - 1
return nums[anchor] + 1
break
#anchor += 1
#return anchor