找出第一個缺失的正數
轉載:https://blog.csdn.net/LaputaFallen/article/details/79966835
Given an unsorted integer array, find the smallest missing positive integer.
Example 1:
Input: [1,2,0]
Output: 3
1
2
Example 2:
Input: [3,4,-1,1]
Output: 2
1
2
Example 3:
Input: [7,8,9,11,12]
Output: 1
1
2
Note:
Your algorithm should run in O(n) time and uses constant extra space.
問題描述
給定一個未排序的整數陣列,返回最小的缺失正整數
問題分析
若是排好序的正整數陣列,為[1, 2, 3, 4, 5…],即i = n - 1(i為下標,n為元素值)
那麼我們通過將”錯位”的元素通過swap轉換到它對應的位置,然後掃描陣列就可以了
看一個例子,[1, 2, 0]
1已就位,2已就位,0跳過
從左到右掃描陣列,發現只有下標為2處未就位,返回2 + 1,即3
解法
class Solution {
public int firstMissingPositive(int[] nums) {
int len = nums.length, i = 0;
/*
第一個if的三種情況分別為
nums[i] <= 0, 非正數
nums[i] == i + 1, 已就位
nums[i] > len,元素值太大,無法找到合適的位置就位
第二個表示元素值未就位,通過swap進行替換,歸位
第三個表示有重複元素,跳過即可
*/
while(i < len){
if(nums[i] <= 0 || nums[i] == i + 1 || nums[i] > len) i++;
else if(nums[nums[i] - 1] != nums[i]) swap(nums, i, nums[i] - 1);
else i++;
}
i = 0;
while(i < len && nums[i] == i + 1) i++;
return i + 1;
}
public void swap(int[] nums, int a, int b){
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
}