题目
- Given an unsorted integer array, find the smallest missing positive integer.
Example:
1
2Input: [7,8,9,11,12]
Output: 1- Note: Your algorithm should run in O(n) time and uses constant extra space.
解题思路
- 本题的题意比较容易理解,即寻找一个无序的数组里面找到一个最小缺失的正整数
- 第一想法是将无序数组进行排序,然后遍历一遍排好序的数组即可找出最小缺失的正整数,但是排序算法最优解的时间复杂度都为O(nlogn),显然不能满足题目的时间复杂度要求
- 其次的主要想法就是利用数组的下标,因为下标是从0开始的,不断累增的数列,并且除0外都是正整数
- 遍历数组,将当前元素交换到其减一后作为下标的位置,即
nums[i]
与nums[nums[i] - 1]
进行交换,即将1
放到数组0
号位,将2
放到数组1
号位,依此类推。这个步骤比较关键,其中小坑也比较多,有些是提交了才发现的- 交换条件的选择,可能被交换的元素必须要满足
> 0
&&< array.size
&&nums[i] != nums[nums[i] - 1]
,其中最后一个条件是避免两个位置不断的执行交换,例如输入[1,1]的情况,造成死循环 - 循环变量的控制,当需要交换的时候需要将循环变量-1,或者说不发生交换的时候,循环变量+1
- 交换条件的选择,可能被交换的元素必须要满足
- 再次遍历数组,将第一个下标 与对应位置元素 - 1不等的下标返回,若都相等,则返回
数组的size
+ 1
- 遍历数组,将当前元素交换到其减一后作为下标的位置,即
实现代码
1 | class Solution { |