题意:
给你一个乱序的数组,让你找出第一个缺失的正整数(原数组可能包含0和负整数),
思路:
题目要求时间复杂度为O(n),空间复杂度为O(1),所以只能借助原数组的空间来求解,很容易想到用下标来标记有没有出现。
即把出现过的整数的对应的下标的值变为负值,但原数组有负数和0干扰(当一个值为负时,不知他是原数组的初始值,还是标记后的值;0的负数依然是0)
又因为,缺失的数必定小于等于数组的长度len+1,所以可以先预处理一遍,把0和和负数的值变为len+1;
JAVA代码:
class Solution {
public int firstMissingPositive(int[] nums) {
int len = nums.length;
for(int i = 0;i<len;i++){
if(nums[i]<=0){
nums[i] = len+1;
}
}
for(int i = 0;i<len;i++){
int temp = Math.abs(nums[i]);
if(temp<=len){
if(nums[temp-1]>0){
nums[temp-1] *= -1;
}
}
}
for(int i = 0;i<len;i++){
if(nums[i]>0){
return i+1;
}
}
return len+1;
}
}