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)時間內常數量空間,所以此題較為考察思維敏捷性。其解題核心思想是將數組的第i位存正數i+1。最后再遍歷一次就可以。
其它人的思想,我也是看了這個思想自己寫的代碼。
盡管不能再另外開辟很數級的額外空間,可是能夠在輸入數組上就地進行swap操作。
思路:交換數組元素。使得數組中第i位存放數值(i+1)。
最后遍歷數組,尋找第一個不符合此要求的元素,返回其下標。整個過程須要遍歷兩次數組,復雜度為O(n)。
下圖以題目中給出的第二個樣例為例,解說操作過程。
媽蛋。這題掙扎好久。
首先思路上,其次臨界條件,這題和以下題異曲同工:
n個元素的數組,里面的數都是0~n-1范圍內的,求數組中反復的某一個元素。沒有返回-1, 要求時間性能O(n) 空間性能O(1)。
public class Solution { public int firstMissingPositive(int[] nums) { if(nums.length == 0) return 1; //第i位存放i+1的數值 for(int i = 0; i < nums.length;i++){ if(nums[i] > 0){//nums[i]為正數,放在i+1位置 //假設交換的數據還是大於0且<i+1,則放在合適的位置,且數據不相等,避免死循環 //這個while是關鍵,其它都是沒有難度的 while(nums[i] > 0 && nums[i] < i+1 && nums[i] != nums[nums[i] -1]){ int temp = nums[nums[i]-1];//交換數據 nums[nums[i]-1] = nums[i]; nums[i] = temp; } } } //循環尋找不符合要求的數據,返回 for(int i = 0; i < nums.length;i++){ if(nums[i] != i+1){ return i+1; } } //假設都符合要求,則返回長度+1的值 return nums.length + 1; } }