若不考虑时间复杂度,空间复杂度的话
思路很简单,定义一个res=1,遍历数组如果找到与res相等就res++,跳出循环,再从头开始遍历,如果找到继续res++,直到数组中所有元素都能与res对应相等,或者遍历完也没找到res相应相等的元素就返回res
class Solution {
public int firstMissingPositive(int[] nums) {
int res = 1;
for (int j = 0; j < nums.length; j++) {
for (int i = 0; i < nums.length; i++) {
if (res == nums[i]){
res++;
break;
}
}
}
return res;
}
}
时间复杂度时O(n2),显然上述方法不太实用。
class Solution {
int len = nums.length;
//把所给数组当成一个hash表,将元素一一对应放到数组里面(1放在下标为0的位置,2放在下标为1的位置,3放在下标为2的位置上,4放在下标为3的位置)
for (int i = 0; i < len; i++){
while (nums[i] >= 1 && nums[i] <= nums.length && nums[nums[i] - 1] != nums[i]){//当nums[i]恰好等于nums[i]-1位置上的值时就不用交换了,所以nums[nums[i] - 1] != nums[i]
swap(nums, i, nums[i] - 1);//交换位置,(1放在0,2放在1,3放在2位置上),将元素i放在nums[i]-1位置上
}
}
//遍历数组,如果nums[i] != i+1,就返回i+1,遍历完都符合要求就返回nums.length+1
for (int i = 0; i < nums.length; i++) {
if (nums[i] != i+1){//i位置需要匹配一个i+1,此时i位置上不是i+1
return i+1;
}
}
return nums.length + 1;
}
//自定义交换函数
private void swap(int[] nums, int index1, int index2){
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}