原題
給出一個無序的正數數組,找出其中沒有出現的最小正整數。
如果給出 [1,2,0], return 3 如果給出 [3,4,-1,1], return 2
只允許時間復雜度O(n)的算法,并且只能使用常數級別的空間。
解題思路
- 類似于桶排序的思路,對于每一個整數,我們按照一定的規則放到相應的位置上,最后再去檢查如果指定位置的數不存在,即為沒有出現的最小正整數
- 規則:1放在array[0],2放在array[1],以此類推
對于[3, 4, -1, 1],運行最終結果為[1, -1, 3, 4]所以檢查到array[1]時,2不存在,2即為沒有出現的最小正整數 - 注意,遍歷數組是,對于每一位要while循環至該位置的數字放到正確的位置為止
while nums[i] <= len(nums) and nums[i] > 0 and nums[nums[i] - 1] != nums[i]:
nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
完整代碼
class Solution(object):
def firstMissingPositive(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if not nums:
return 1
for i in range(len(nums)):
while nums[i] <= len(nums) and nums[i] > 0 and nums[nums[i] - 1] != nums[i]:
nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
for i in range(len(nums)):
if nums[i] != i + 1:
return i + 1
return len(nums) + 1