题目:
给你一个未排序的整数数组 nums
,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n)
并且只使用常数级别额外空间的解决方案。
方法:原地哈希
( 原地哈希)对于一个长度为 n 的数组,其中没有出现的最小正整数只能在 [1,n+1] 中。这是因为如果 [1,n] 都出现了,那么答案是 n+1,否则答案是 [1,n] 中没有出现的最小正整数。
class Solution {
public int firstMissingPositive(int[] nums) {
int n = nums.length;
for(int i = 0; i < n; i++){
while(nums[i] >= 1 && nums[i] <= n && nums[i] != nums[nums[i] - 1]) {
int temp = nums[nums[i] - 1];
nums[nums[i] - 1] = nums[i];
nums[i] = temp;
}
}
for(int i = 0; i < n ; i++)
if( nums[i] != i + 1)
return i + 1;
return n + 1;
}
}
注意 while循环的条件以及 i = nums[ i ] - 1
时空复杂度: