[LeetCode] 41. First Missing Positive ☆☆☆☆☆(第一個丟失的正數)
阿新 • • 發佈:2019-01-04
Given an unsorted integer array, find the smallest missing positive integer.
Example 1:
Input: [1,2,0]
Output: 3
Example 2:
Input: [3,4,-1,1]
Output: 2
Example 3:
Input: [7,8,9,11,12]
Output: 1
Note:
Your algorithm should run in O(n) time and uses constant extra space.
思路:這個題剛開始是沒有思路的,難就難在O(n)時間內常數量空間,所以此題較為考察思維敏捷性。其解題核心思想是將陣列的第i位存正數i+1。最後再遍歷一次就可以。
其它人的思想,我也是看了這個思想自己寫的程式碼。
儘管不能再另外開闢很數級的額外空間,可是能夠在輸入陣列上就地進行swap操作。
思路:交換陣列元素。使得陣列中第i位存放數值(i+1)。
最後遍歷陣列,尋找第一個不符合此要求的元素,返回其下標。整個過程須要遍歷兩次陣列,複雜度為O(n)。
下圖以題目中給出的第二個樣例為例,解說操作過程。
媽蛋。這題掙扎好久。
首先思路上,其次臨界條件,這題和以下題異曲同工:
n個元素的陣列,裡面的數都是0~n-1範圍內的,求陣列中反覆的某一個元素。沒有返回-1, 要求時間效能O(n) 空間效能O(1)。
public int firstMissingPositive(int[] nums) { if (null == nums || nums.length == 0) { return 1; } for (int i = 0; i < nums.length; i++) { while (nums[i] > 0 && nums[i] != i + 1 && nums[i] <= nums.length) {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; } } return nums.length + 1; }