此次的題目之因此說是難,其實仍是在於對於某些空間和時間的限制。java
讀了題目咱們或許還不理解題意,實際上是說正常的數組應該是[1,2,3,4....]這樣的數組,或者打亂次序的,可是對於不是這樣的數組,咱們須要從中找到從那個數字開始缺乏的,這個數字就是最小的數字,好比2,3,4,那麼缺乏的就是1。好比1,2,4,就是少了3。這樣咱們就理解了。可是時間複雜度要求O(n),空間使用是常數級別的。數組
咱們仔細思考一下,其實下標和這個是有關係的,正常的,最終均可以變成num[i]=i+1,因而咱們能夠將數組進行一邊掃描,若是已經知足這種性質的不用動,若是num[i]的值小於1或者大於長度的都是不該該存在的,所以置爲一個標誌,便於之後報錯。若是在範圍以內的,咱們就讓它們物歸原位。好比num[i]=x,那麼這個元素應該在下標爲x-1的位置上,所以咱們將num[x-1]和num[i]上的元素進行交換。交換的時候若是發現這兩個值相等,則將非本位的值置爲零,否者直接交換。this
class Solution { // let's rearrange the numbers in the array between 1 and length // in order (in place), leaving a 0 for numbers not present, // and ignoring the numbers out of this range. // then in second pass find the first zero occurence, or if none, // return length+1 // for example, [3,4,-1,1] will become [1,0,3,4] public int firstMissingPositive(int[] nums) { for (int i=0; i<nums.length;) { int n = nums[i]; if (n<1 || n>nums.length) { nums[i]=0; // out of range, remove i++; } else if (n-1==i) { i++; // in range and in position, leave as is } else { // in range but not in position, swap int temp = nums[n-1]; nums[n-1]=n; nums[i]=(temp==n)?0:temp;//這裏最妙的就是沒有i++,以此確保下一次還從這個地方開始 } } for (int i=0; i<nums.length; i++) { if (nums[i]==0) return i+1; } return nums.length+1; } }
遇到問題須要和實際的條件相聯繫,另外須要認真的判斷全部的可能。spa