解题思路:声明一个比元素组长1的数组,因为声明的这个数组0号下标不准备遍历,然后遍历1->a.length,若发现值有0存在说明这个值没有出现过则返回,如果都为1,说明都存在了,只需要返回数组最后一个值下标的下一个,也就是数组的长度。时间复杂度O(N),空间复杂度O(N)。
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int minNumberDisappeared (int[] nums) {
int[] a = new int[nums.length + 1];
// write code here
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0 && nums[i] < a.length) {
a[nums[i]] = 1;
}
}
for (int i = 1; i < a.length; i++) {
if (a[i] == 0) {
return i;
}
}
return a.length;
}
}
解法二:正数变负法,存在的时候就将其下标变成负数,最后遍历整个数组的时候遇到正数说明不存在该值就返回其下标。时间复杂度O(N),空间复杂度O(1)。
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int minNumberDisappeared (int[] nums) {
// write code here
int length = nums.length;
for (int i = 0; i < length; i++) {
if (nums[i] <= 0) {
//将本来是负值和0的数变成正数
nums[i] = length + 100;
}
}
//遍历数组,存在的下标都变成负数
for (int i = 0; i < length; i++) {
if (Math.abs(nums[i]) <= length) {
nums[Math.abs(nums[i]) - 1] = -nums[Math.abs(nums[i]) - 1];
}
}
//遇到正数,就返回他的下标
for (int i = 0; i < length; i++) {
if (nums[i] > 0) {
return i + 1;
}
}
//否则返回下标的下一个位置
return length + 1;
}
}