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