Leetcode41. 缺失的第一个正数

  • 题目要求:

image.png
这道题其实难在他给的要求说明:算法的时间复杂度为O(n),而且只能用常数级别的空间算法

  • 思路:数组

    • 缺失的数字必定在[1,n+1]的范围中,n为数组长度+1
    • 遍历数组,把全部大于0的数放在元素-1的位置上spa

      • 好比[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
相关文章
相关标签/搜索