- 题目要求:
这道题其实难在他给的要求说明:算法的时间复杂度为O(n),并且只能用常数级别的空间
-
思路:
- 缺失的数字一定在[1,n+1]的范围中,n为数组长度+1
-
遍历数组,把所有大于0的数放在元素-1的位置上
- 比如[1,2,0]这个数组,把1与nums[0]交换,把2与nums[1]交换
- 都交换完毕后,找到元素的下标不为元素减一的第一个元素,返回他
- 如果没有,返回n+1,n为数组长度+1
- 核心代码:
# 遍历数组
for i in range(len(nums)):
#如果该元素大于0,而且该元素的值小于等于数组长度,说明他也在数组应该排序的范围里
#前两项都满足,而且当前元素不在下标为当前元素-1的位置,把这个元素交换到元素值-1的位置去
while nums[i] > 0 and nums[i] <= len(nums) 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
# 如果没找到,返回数组长度+1(没找到,如果数组长度为3,说明此时数组为[1,2,3],则缺失的第一个正整数为4)
return len(nums) + 1
- 完整代码:
class Solution(object):
def firstMissingPositive(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
for i in range(len(nums)):
while nums[i] > 0 and nums[i] <= len(nums) and nums[nums[i]-1] != nums[i]:
nums[nums[i]-1] , nums[i] = nums[i] , nums[nums[i]-1]
print nums
for i in range(len(nums)):
if nums[i] != i + 1:
return i + 1
return len(nums) + 1
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。