题目描述:

给你一个未排序的整数数组,里面可能包含正整数、0和负数,请你找出缺失的最小正整数。例如:arr = [-22, -10, 78, 3, 1, 2], 缺失的最小正整数就是4。

解法一:排序,然后,跳到第一个正整数部分,然后,判断第一个是不是1,不是,则返回1;如果是,就寻找数组中差为1的连续元素子集,如果存在不连续的,则返回最后一个连续元素的值+1;如果都连续,则返回数组中最大值+1。

class Test {  public static int findMissingSmallestPositive(int arr[]) {    Arrays.sort(arr);    int index = 0;
while (arr[index] <= 0 && index < arr.length) { index++; }
if (index == arr.length) return 1; int firstIndex = index; if (arr[firstIndex] != 1) return 1;
boolean notClose = false;
for (; index < arr.length - 1; index++) { if (arr[index] + 1 != arr[index + 1]) { notClose = true; break; } }
if (notClose) { return arr[index] + 1; } else { return arr[arr.length - 1] + 1; } }}

解法二:空间换时间。

public static int findMissingSmallestPositive(int arr[]) {    boolean flags[] = new boolean[arr.length];
for (int i = 0; i < flags.length; i++) { flags[i] = false; }
int max = Integer.MAX_VALUE; for (int i = 0; i < arr.length; i++) { max = (max < arr[i]) ? arr[i] : max; if (arr[i] >= 0) { flags[arr[i]] = true; } }
for (int i = 1; i < flags.length; i++) { if (!flags[i]) { return i; } }
return max + 1; }

第二种时间复杂度为O(n)

发表回复

后才能评论