First Missing Positive
Given an unsorted integer array, find the first missing positive integer.
For example,
Given [1,2,0]
return 3
,
and [3,4,-1,1]
return 2
.
Your algorithm should run in O(n) time and uses constant space.
这题要求比较严格,要求O(n)时间,O(1)空间,所以简单的方法排序, hashmap等都无法使用.这里主流的思路是使用count sort, 达到 nums[0] = 1, nums[1] = 2,....这样的效果.
这样处理之后,再进行一次扫描, 第一个nums[i] != i+1的位置,就是first missing positive.代码如下:
class Solution(object): def firstMissingPositive(self, nums): """ :type nums: List[int] :rtype: int """ #count sort, nums[0] = 1, nums[1] =2, nums[2] = 3 n = len(nums) for i in xrange(n): while nums[i] > 0 and nums[i] <= n and nums[nums[i] - 1] != nums[i]: #之所以不用nums[i] - 1 != i, 是为了防止两个位置的元素相等 tmp = nums[nums[i] - 1] nums[nums[i] -1] = nums[i] nums[i] = tmp #nums[i],nums[nums[i]-1] = nums[nums[i]-1], nums[i] #注意这里直接交换是错误的 for i in xrange(n): if nums[i] != i+1: return i+1 return n+1
每次swap,都至少可以使一个元素回到正确位置,所以是O(n)时间复杂度.
posted on 2016-08-30 10:34 Sheryl Wang 阅读(107) 评论(0) 编辑 收藏 举报