题目描述:
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
说明: 你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。
解题思路1:
- 首先对列表中的数进行排序
- 判断列表长度与列表中最大数之间的关系,并取出最大值
- 依次判断,返回最小正整数
代码1:
class Solution():
def firstMissingPositive(self, List):
nums = sorted(List)
max_num = max(len(nums), nums[len(nums)-1])
for i in range(1, max_num):
if i not in nums:
return i
return max_num
s = Solution()
List = [7, 8, 9, 11, 12]
print(s.firstMissingPositive(List))
解题思路2:
- 依次进行判断,但这样效率不一定能保证
代码2:
class Solution:
def firstMissingPositive(self, nums):
i = 1
while i:
if i in nums:
i += 1
else:
return i
s = Solution()
nums = [1, 2, 0]
print(s.firstMissingPositive(nums))
解题思路3:
- 由于有时间复杂度O(n)的要求,所以只能进行遍历,不能进行排序。
- 首先把数组中的正数都拿出来,放到字典里,则数组中没有出现的最小整数只可能比数组中正数的个数n小,所以可以从1到n遍历一下,看一下数字是否在字典里即可知道缺失的最小整数。
代码3:
class Solution:
def firstMissingPositive(self, nums):
if not nums:
return 1
nums_pos = {}
max_num = nums[0]
for num in nums:
if num < 0:
continue
nums_pos[num] = 0
max_num = max(max_num, num)
if max_num <= 0:
return 1
ret = max_num + 1
for item in range(1, len(nums_pos)+1):
if item not in nums_pos:
ret = item
break
return ret
s = Solution()
nums = [7,8,9,11,12]
print(s.firstMissingPositive(nums))
参考链接:
https://github.com/Jedi-XL/LeetCodeByPython