題目:
給定一個未排序的整數數組,找出其中沒有出現的最小的正整數。
示例 1:
輸入: [1,2,0]
輸出: 3
示例 2:
輸入: [3,4,-1,1]
輸出: 2
示例 3:
輸入: [7,8,9,11,12]
輸出: 1
說明:
你的算法的時間複雜度應爲O(n),並且只能使用常數級別的空間。
想法:因爲題目規定不能開闢額外的空間,所以,考慮到遍歷數組,n爲數組長度。如果nums[i]大於零且數字在n以內,且沒有在應該的位置,將其放到其規定的位置,有點像分好了n個桶,將該位置的數字放到其應該在的桶。然後再遍歷一次數組,看看第一個不符合的桶,返回。如果所有的n個數都在其正確的位置,那麼第一個缺失的數就是n+1。
解法:
public static int firstMissingPositive(int[] nums) {
for(int i = 0;i < nums.length;i++) {
while(nums[i] > 0 && nums[i] <= nums.length && nums[i] != nums[nums[i] - 1])
swap(nums,i,nums[i]-1);
}
for(int i = 0;i < nums.length;i++) {
if(nums[i] != i + 1) return i + 1;
}
return nums.length + 1;
}
public static void swap(int[] nums,int i,int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}