题目
方法一:看代码注释
public class FirstMissingPositive {
public static void main(String[] args) {
FirstMissingPositive positive = new FirstMissingPositive();
//int[] nums = {1,2,0};
//int[] nums = {3,4,-1,1};
int[] nums = {7,8,9,11,12};
//int[] nums = {0,2,2,1,1};
int r = positive.firstMissingPositive(nums);
System.out.println(r);
}
public int firstMissingPositive(int[] nums) {
//为满足时间复杂度为O(N)且空间复杂度为O(1)
//不能有额外的空间占用,也不能嵌套去遍历
//所以在nums上进行调整
//因为是找出其中没有出现的最小的正整数,所以nums里的负数没啥实际意义了
//将nums里的负数统一改成nums.length
//再循环将nums[i]的值对应的数组下标的值改为负数,比如num[i]=1,那么num[1]=-num[1]。
//最后只需找到第一个不是负数的num[i],结果就是i+1。
int n = nums.length, min = 0;
for (int i = 0; i < n; i++) {
if (nums[i]<=0) {
nums[i] = n+1;
}
}
for (int i = 0; i < n; i++) {
int k = Math.abs(nums[i]); //绝对值
if (k<=n) {
nums[k-1] = -Math.abs(nums[k-1]);
}
}
for (int i = 0; i < n; i++) {
if (nums[i]>0) {
return i+1;
}
}
return n+1;
}
}
LeetCode测试结果