题目描述:
给你一个未排序的整数数组,里面可能包含正整数、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)
声明:
1、本站发布的内容部分购买于网络,仅供读者学习与参考,如有侵权,请联系站长进行删除处理。
2、本站一切资源不代表本站立场,不代表本站赞同其观点和对其真实性负责。
3、本站仅分享资源,以极低的价格降低大家被割韭菜的损失。本站无法保证资源质量,所以介意的小伙伴请勿下单!
4、资源大多存储在云盘,如发现链接失效,请联系站长第一时间更新。