package com.interview.array;
/**
* https://leetcode.com/problems/first-missing-positive/
*/
public class FirstPositiveMissing {
public int firstMissingPositive(int[] nums) {
int startOfPositive = segregate(nums);
for (int i = startOfPositive; i < nums.length; i++) {
int index = Math.abs(nums[i]) + startOfPositive - 1;
if (index < nums.length) {
nums[index] = -Math.abs(nums[index]);
}
}
for (int i = startOfPositive; i < nums.length; i++) {
if (nums[i] > 0) {
return i - startOfPositive + 1;
}
}
return nums.length - startOfPositive + 1;
}
private int segregate(int[] nums) {
int start = 0;
int end = nums.length -1 ;
while (start <= end) {
if (nums[start] <= 0) {
start++;
} else if (nums[end] > 0) {
end--;
} else {
swap(nums, start, end);
}
}
return start;
}
private void swap(int[] nums, int start, int end) {
int t = nums[start];
nums[start] = nums[end];
nums[end] = t;
}
}