LeetCode Top Interview Questions 41. First Missing Positive (Java版; Hard)
题目描述
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.
class Solution {
public int firstMissingPositive ( int [ ] nums) {
int n = nums. length;
if ( n== 0 ) {
return 1 ;
}
int i= 0 ;
while ( i< n) {
if ( nums[ i] != i+ 1 && nums[ i] - 1 < n && nums[ i] - 1 >= 0 && nums[ nums[ i] - 1 ] != nums[ i] ) {
swap ( nums, nums[ i] - 1 , i) ;
} else {
i++ ;
}
}
i= 0 ;
for ( ; i< n; i++ ) {
if ( nums[ i] != i+ 1 ) {
break ;
}
}
return i+ 1 ;
}
private void swap ( int [ ] arr, int i, int j) {
int tmp = arr[ i] ;
arr[ i] = arr[ j] ;
arr[ j] = tmp;
}
}
第一次做; 两边遍历; 双指针的做法稍微容易乱; 可以不用双指针, 进行两次遍历即可
class Solution {
public int firstMissingPositive ( int [ ] nums) {
int i= 0 ;
while ( i< nums. length) {
if ( i+ 1 != nums[ i] && nums[ i] - 1 >= 0 && nums[ i] - 1 < nums. length && nums[ nums[ i] - 1 ] != nums[ i] ) {
swap ( nums, i, nums[ i] - 1 ) ;
}
else {
i++ ;
}
}
i= 0 ;
for ( ; i< nums. length; i++ ) {
if ( i+ 1 != nums[ i] )
break ;
}
return i+ 1 ;
}
public void swap ( int [ ] arr, int i, int j) {
int tmp = arr[ i] ;
arr[ i] = arr[ j] ;
arr[ j] = tmp;
}
}
第一次做; 双指针, l表示[0,l-1]上依次是[1,l], r表示[0,r-1]上最好情况是[1,r], 也表示[r,end]是无效区域
class Solution {
public int firstMissingPositive ( int [ ] nums) {
if ( nums== null|| nums. length== 0 )
return 1 ;
int l = 0 ;
int r = nums. length;
while ( l< r) {
if ( nums[ l] == l+ 1 ) {
l++ ;
}
else if ( nums[ l] < l+ 1 || nums[ l] > r || nums[ l] == nums[ nums[ l] - 1 ] ) {
r-- ;
swap ( nums, l, r) ;
}
else {
swap ( nums, l, nums[ l] - 1 ) ;
}
}
return l+ 1 ;
}
public void swap ( int [ ] arr, int i, int j) {
int tmp = arr[ i] ;
arr[ i] = arr[ j] ;
arr[ j] = tmp;
}
}