Given an unsorted integer array, find the first missing positive integer. For example, Given [1,2,0] return 3, and [3,4,-1,1] return 2. Your algorithm should run in O(n) time and uses constant space.
在數組中找到第一個漏掉的正整數。若是能夠的話,使用O(N)的時間複雜度和O(1)的空間複雜度。java
排序後尋找顯然是最快的。排序的時間複雜度要依靠java底層的依賴。以後再用O(N)的時間複雜度找到第一個漏掉的整數後即退出遍歷。面試
public int firstMissingPositive(int[] nums) { int size = nums.length; if(size == 0) return 1; Arrays.sort(nums); int positive = 1; for(int i = 0 ; i<size ; i++){ if(nums[i]<positive) continue; if(nums[i]>positive) return positive; positive++; } return positive; }
要實現這種空間複雜度,通常須要有限數量的臨時變量來記錄遍歷的有效範圍,再利用原有題目中的數據結構來存儲其他的臨時變量。這些臨時變量能夠是排除出的量,也能夠是有效量。在這裏我用leftPointer
記錄有效數字的開始下標(即將無效數字轉移到leftPointer左側),利用maxPositive
記錄數組最大有效整數(換句話說,若是一個數組的大小爲9,則該數組的最大first missing positive integer即爲10,一旦數組中出現重複或是小於1或是大於9的數字,該數字即爲無效數字)。當遇到的數字爲有效數字時,則將該數字放到對應當前起始下標leftPointer其相應的位置上。數組
public int firstMissingPositive2(int[] nums){ int size = nums.length; int positive = 1; int leftPointer = 0; int maxPositive = size; while(leftPointer<size){ if(nums[leftPointer] == positive){ leftPointer++; positive++; } else if(nums[leftPointer] > maxPositive || nums[leftPointer] < positive || nums[leftPointer]==nums[leftPointer+nums[leftPointer]-positive]){ leftPointer++; maxPositive--; }else{ int temp = nums[leftPointer]; nums[leftPointer] = nums[leftPointer+temp-positive]; nums[leftPointer+temp-positive] = temp; } } return positive; }
想要了解更多開發技術,面試教程以及互聯網公司內推,歡迎關注個人微信公衆號!將會不按期的發放福利哦~微信