算法-缺失的最小正數
缺失的最小正數
這道算法題是非常經典的一道題了Leetcode-42,問題描述如下:
給你一個未排序的整數數組,請你找出其中沒有出現的最小的正整數。
示例 1:
輸入: [1,2,0]
輸出: 3
示例 2:
輸入: [3,4,-1,1]
輸出: 2
示例 3:
輸入: [7,8,9,11,12]
輸出: 1
乍一看上去覺得這道題平平無奇,排個序就知道了,然而事情並沒有那麼簡單,不然他咋能成爲一道Hard題的?
這道題一般會要求我們在O(N)時間複雜度完成,要達到這一點,排序就不行了,有同學可能會說,用HashMap啊,當然,用hashMap也是可以的,但是如果要求我們必須要空間O(1)的算法,那就不適用了。使用Hash的的思想沒錯,不過我們可以原地使用數組實現。
我們只需要把符合數組範圍的數據映射到數組中他應該在的位置即可,然後我們從數組的0位置遍歷,直到遍歷到不符合nums[i]==i+1的位置即可!i+1就是我們需要的值。當然,如果全都符合,那目標值就是數組長度+1了。
public int firstMissingPositive(int[] nums) {
for(int i=0;i<nums.length;i++){
//這裏首先要保證將符合數組範圍內的數據放入到數組位置
//nums[i]!=nums[nums[i]-1]這裏解釋一下,其實就是:nums[i]-1!=i
while(nums[i]>0&&nums[i]<nums.length&&nums[i]!=nums[nums[i]-1]){
swap(nums,nums[i]-1,i);
}
}
for(int i=0;i<nums.length;i++){
if(nums[i]!=i+1){
return i+1;
}
}
return nums.length+1;//所有數據都歸位了
}
private void swap(int[] nums,int i,int j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}