2019.5.8 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)
这题主要难在时间和空间复杂度的限制。如果时间复杂度不限制那就很好说了,直接进行排序即可。如果时间复杂度限制为O(n),空间复杂度不限制的话有什么好方法呢?
可以用空间换时间,进行桶排序。现在对空间复杂度也进行了限制,单纯开辟常数的存储空间很难记录不连续的多个数值。但是我们观察发现:第一个未出现的正整数必定在1至nums.length+1之中,因此可以利用桶排序的思想,借助给定数组记录每一个出现过的值。
只需要两次循环:
第一次循环,将每一个在1至num.length中的数num放入对应桶nums[num-1]中
第二次循环,将第一个和桶不对应的数字位置+1进行输出,若数组全对应,则输出nums.length+1
Given an unsorted integer array, find the smallest missing positive integer.
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
说明:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。