LeetCode题解(python)-41. 缺失的第一个正数

LeetCode题解(python)

41. 缺失的第一个正数

题目描述

给定一个未排序的整数数组,找出其中没有出现的最小的正整数。

示例 1:

输入: [1,2,0]
输出: 3

示例 2:

输入: [3,4,-1,1]
输出: 2

示例 3:

输入: [7,8,9,11,12]
输出: 1

说明:

你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。

解题心得

本题看似简单,实则坑贼多。

首先是时间复杂度和空间复杂度的要求,让很多操作望而却步。

其次在实现过程中各种小问题,下面简单列一下:

算法思路(参考评论第一名的骚操作):

遍历一次数组把大于等于1的和小于数组大小的值放到原数组对应位置,然后再遍历一次数组查当前下标是否和值对应,如果不对应那这个下标就是答案,否则遍历完都没出现那么答案就是数组长度加1。

怎么将于索引值对应的元素放到对应位置呢?(不能重新开一个数组,必须原地交换),python中的元素交换的坑就来了。

正确交换:nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]

错误交换1:

         temp = nums[i]
         nums[i] = nums[nums[i]-1]
         nums[nums[i]-1] = temp

错误交换2:

nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]

(python中前者优先啊,不管是写判断还是写什么,错误交换2就明显踩了坑)

另外的坑:

交换完当前元素要继续交换下一元素嘛~注意喂!当前位置已经不是原来的元素啦,先别跑,先把当前的元素继续搜索合适的位置交换啊,饭要一口一口吃,位置要一个一个来,着急跑到下一个位置就凉了……

执行用时 : 52 ms, 在First Missing Positive的Python3提交中击败了48.20% 的用户

解题代码

class Solution:
    def firstMissingPositive(self, nums):
        i = 0
        while i < len(nums):
            if 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]
            else:
                i += 1
        for i in range(len(nums)):
            if i+1 != nums[i]:
                return i+1
        return len(nums)+1

错误示范

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        if len(nums) == 0:
            return 1
        for i in range(len(nums)):
            if nums[i]>0 and nums[i]<=len(nums) and nums[nums[i]-1] != nums[i]:
                # temp = nums[i]
                # nums[i] = nums[nums[i]-1]
                # nums[nums[i]-1] = temp
                nums[nums[i]-1],nums[i] = nums[i],nums[nums[i]-1]
        for i in range(len(nums)):
            if i+1 != nums[i]:
                return i+1
        return len(nums)+1

你可能感兴趣的:(算法,LeetCode题解)