任务是找到第一个在给定数组中不存在的正整数。
我已经找到了正确的解决方案,但是我不明白为什么我的解决方案有“大”输入的好时机而且“中等”不好。
这是我的解决方案:
import java.util.Arrays;
import java.util.stream.*;
class Solution
{
public int solution(int[] A)
{
int[] a = IntStream.of(A).distinct().filter( s -> s > 0 ).toArray();
Arrays.sort(a);
int next = 1;
for (int i = 0; i < a.length; i++ )
{
if( a[i] == next )
next++;
else if ( a[i] > next)
break;
}
return next;
}
}
答案 0 :(得分:2)
问题规范说预期的最坏情况时间复杂度为O(N),因此您无法对数据进行排序。排序为O(N log N)。如果您的分类解决方案无论如何都被接受了,显然他们的测试不够严格,或者他们最大的测试用例没有正确构建。
幸运的是,您不必对数据进行排序。您已经预先知道解决方案最多是输入数组的长度,因此只有1和input.length
之间的数字才有意思。你有足够的内存为所有这些保留一个布尔值(你已经存储了那么多整数)
public int solution (int[] input) {
boolean[] isPresent = new boolean[input.length + 1];
for (int i : input) {
if (0 < i && i < isPresent.length) {
isPresent[i] = true;
}
}
for (int i = 1; i < isPresent.length; i++) {
if (!isPresent[i]) return i;
}
return input.length + 1;
}