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.
The trick point for this problem is that the index of the array can be utilized as a ordered hash table. While iterating the array, if we find one positive integer that is not in the position of value-1, swap it to that spot. After swapping, we can find the first index where A[index] != index+1. Then it will be the first missing positive.
C++ Code:
/* * func: first_missing_positive * goal: find the first missing positive integer in the array * @param A[]: input array A * @param n: the size of the array * return: the first missing positive value */ /* * Put value within range 1 to len(A) to A[index-1]. Then find the * first one that doesn't match. * complexity: time O(n), space O(1) */ int first_missing_positive(int A[], int n){ assert(n > 0); int index = 0; while(index < n){ if(A[index] > 0 && A[index] <= n && A[A[index]-1] != A[index]){ std::swap(A[A[index]-1], A[index]); }else{ index += 1; } } index = 0; while(index < n && A[index] == index + 1){ ++index; } return index+1; }
Python Code:
# func: find the first missing positive values in the array # @param A: input list A # @return: an integer # complexity: time O(n), space O(1) def find_missing_positive(A): index = 0 while index < len(A): #If the current value is in the range but not in the right spot #Swap it to its spot if 0 < A[index] <= len(A) and A[A[index]-1] != A[index]: tmp = A[A[index]-1] A[A[index]-1] = A[index] A[index] = tmp else: index += 1 index = 0 while index < len(A) and A[index] == index+1: index += 1 return index + 1
No comments:
Post a Comment