題目
給你一個未排序的整數數組,請你找出其中沒有出現的最小的正整數。
示例 1:
輸入: [1,2,0]
輸出: 3
示例 2:
輸入: [3,4,-1,1]
輸出: 2
示例 3:
輸入: [7,8,9,11,12]
輸出: 1
提示:
你的算法的時間複雜度應爲O(n),並且只能使用常數級別的額外空間。
解題思路
因爲我們要找的數在 [1, N + 1] 裏,最後 N + 1 這個元素我們不用找,只有在前面的 N 個元素都找不到的情況下,我們才返回 N + 1。所以我們可以把原始的數組當做哈希表來使用,將數值爲 i 的數映射到下標爲 i - 1 的位置,例如 1 這個數放到下標爲 0 的位置, 2 這個數放到下標爲 1 的位置,按照這種思路整理一遍數組。然後我們再遍歷一次數組,第一個遇到的值不等於下標 +1 的那個數,那下標 +1 就是我們要找的缺失的第一個正數。如果遍歷完數組也沒找到,就返回 N + 1。
複雜度分析:
時間複雜度:O(N),其中 N 是數組的長度。
空間複雜度:O(1)。
代碼
class Solution {
public int firstMissingPositive(int[] nums) {
int n = nums.length;
for(int i=0; i<n; i++){
// 滿足在指定範圍內、並且沒有放在正確的位置上,才交換
// 例如:數值 3 應該放在索引 2 的位置上
while(nums[i]>=1 && nums[i]<=n && nums[i] != nums[nums[i]-1]){
// 交換兩個數
int temp = nums[i];
nums[i] = nums[temp-1];
nums[temp-1] = temp;
}
}
for(int i=0; i<n; i++){
if(nums[i] != i+1){
return i+1;
}
}
return n+1;
}
}