【LeetCode41】First Missing Positive
阿新 • • 發佈:2019-01-03
Given an unsorted integer array, find the smallest missing positive integer. Your algorithm should run in O(n) time and uses constant extra space. 題意:求一個數組中最小的缺失正數。要求O(n)的時間複雜度和O(1)的空間複雜度。 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:
思路:難點是O(n)的時間複雜度和O(1)的空間複雜度。因為是僅尋找第一個缺失的正數,所以若所有正數都在,則他們的值應該是1~nums.size()連續存在的。把每個值換到下標所在位置(使nums[i]==i+1),第一個不在對應位置的正數即為缺失值。替換過程如下:
需要注意,若當前元素的值在範圍(1~nums.size())之外,則不需要交換,肯定是無效值;此外若要交換的兩個值相同,則也不能交換,一是沒必要,因為該值已經在正確位置,二是不能換,因為會造成死迴圈。
int firstMissingPositive(vector<int>& nums) { int len = nums.size(); for (int i = 0; i<nums.size();) { if (nums[i] >= 1 && nums[i] <= nums.size() && nums[i] != i + 1 && nums[i] != nums[nums[i] - 1]) swap(nums[i], nums[nums[i] - 1]); else i++; } //輸出第一個不在位置上的正數 for (int i = 0; i<nums.size(); i++) if ((i + 1) != nums[i]) return i + 1; return len + 1; }