1. 程式人生 > >【LeetCode41】First Missing Positive

【LeetCode41】First Missing Positive

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