1. 程式人生 > >[LeetCode] 41. First Missing Positive ☆☆☆☆☆(第一個丟失的正數)

[LeetCode] 41. First Missing Positive ☆☆☆☆☆(第一個丟失的正數)

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; }

 

 

https://www.cnblogs.com/clnchanpin/p/6727065.html