题目:
Given an unsorted integer array, find the smallest missing positive integer.
Example 1:
Input: [1,2,0]
Output: 3
Example 2:
Input: [3,4,-1,1]
Output: 2
Example 3:
Input: [7,8,9,11,12]
Output: 1
Note:
Your algorithm should run in O(n) time and uses constant extra space.
题意:
给定一个乱序整数数组,找出丢失的最小正整数,题目也给了几个例子。
这道题主要困难在 只能有O(n)的复杂度,所以排序用不了,并且只能用固定的额外空间(所以一些动态存储的数据结构不适合)
解法:
这个题我看到之后却是没有什么思路,网上参考了大佬的想法
个人理解如下:
我们可以假定最完美的数组形式就是
[1,2,3,4 ....]
也就是 num[i]=i+1 例如 num[0]=1 num[1]=2 ..
所以,我们通过一次遍历,需要做的就是把数放到合适的位置,比如对于 1 3 2 4
我们需要把 3放到index(数组下标)=2的位置
把2放到index=1的位置
具体实现算法如下:
1.如果我们当前遇到的为非正整数, 我们直接跳入入下一个index
2.如果 nums[i] >nums.length 说明它不可能出现在合理的系列中(例如 17 2,对于7 它已经大于了总长度3,它没有位置可以放),我们直接他跳入下一个index
3.如果当前 nums[num[i]-1] != nums[i] ,我们交换 index num[i]-1 和 i
这里需要注意的是 我们不能用 num[i]-1 != i 来做判别
因为可能存在两个相等的值 例如 1 1
当我们在循环到第二个1 时,根据 num[1]-1 =0!= 1 ,交换 1 1,结果第二次还会检测到相同条件,最后陷入死循环
代码:
class Solution {
public int firstMissingPositive(int[] nums) {
int i=0;
while(i < nums.length){
if(nums[i] >= 1 && nums[i] <= nums.length && nums[nums[i]-1] != nums[i]) {
swap(nums, i, nums[i]-1);
}
else{
i++;
}
}
i=0;
while(i < nums.length && nums[i] == i+1) i++;
return i+1;
}
private void swap(int[] nums, int i, int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}