leetcode題庫——缺失的第一個正數
阿新 • • 發佈:2018-11-25
題目描述:
給定一個未排序的整數陣列,找出其中沒有出現的最小的正整數。
示例 1:
輸入: [1,2,0] 輸出: 3
示例 2:
輸入: [3,4,-1,1] 輸出: 2
示例 3:
輸入: [7,8,9,11,12] 輸出: 1
說明:
你的演算法的時間複雜度應為O(n),並且只能使用常數級別的空間。
方法:
class Solution { public: int firstMissingPositive(vector<int>& nums) { int i=0,flag; while(i<nums.size()){ if(nums[i]<=nums.size()&&nums[i]>0&&nums[i]!=nums[nums[i]-1]){ flag=nums[i]; nums[i]=nums[flag-1]; nums[flag-1]=flag; } else i++; } for(int i=0;i<nums.size();i++) if(nums[i]-i!=1) return i+1; return nums.size()+1; } };
思路:
對陣列內部進行粗略排序。即將元素數字,放到對應下標位置,比如元素1應該放到nums[0],即第1個位置 ;元素9應該放到nums[8]即第9個位置。在進行粗略排序時,如果元素的值比陣列長度大,則跳過,因為要找的結果肯定比這個值小,另外,若要進行交換的兩個元素值相等,也不必進行交換。
最後,遍歷陣列,將元素值與下標相減,差不為1,則此處該有的nums[i]沒有,也就是我們要找的缺失的正數。最後如果遍歷結束,都符合要求,即下標與值對應,那麼缺的這個正數肯定就是nums.size()+1了。