First Missing Positive-計數排序/桶排序
阿新 • • 發佈:2019-02-16
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)。
剛開始想動態規劃,沒想出來,後來看網上說線性排序,看了別人的方法後才懂的。
既然不能用額外空間,那就只有利用陣列本身,跟Counting sort一樣,利用陣列的index來作為數字本身的索引,把正數按照遞增順序依次放到陣列中。即讓A[0]=1, A[1]=2, A[2]=3, ... , 這樣一來,最後如果哪個陣列元素違反了A[i]=i+1即說明i+1就是我們要求的第一個缺失的正數。對於那些不在範圍內的數字,我們可以直接跳過,比如說負數,0,或者超過陣列長度的正數,這些都不會是我們的答案。要注意的是,交換之後還需要判斷交換來數字是否滿足條件,不滿足的話則繼續交換。實 現中還需要注意一個細節,就是如果當前的數字所對應的下標已經是對應數字了,那麼我們也需要跳過,因為那個位置的數字已經滿足要求了,否則會出現一直來回
交換的死迴圈。 http://www.cnblogs.com/ccsccs/articles/4216113.html
程式碼如下:
class Solution { public:// int firstMissingPositive(vector<int>& nums) { int i, size = nums.size(); for(i = 0; i < size; ++i){ while(nums[i]!=i+1&&nums[i]>0&&nums[i]<size){ int temp = nums[i]; if(nums[temp-1]==temp) nums[i] = -1; else{ nums[i] = nums[temp-1]; nums[temp-1] = temp; } } } for(i = 0; i < size; ++i) if(nums[i]!=i+1) break; return i+1; } };