Codility MissingInteger任务,一个案例超时

时间:2015-07-27 11:48:25

标签: java stream

任务是找到第一个在给定数组中不存在的正整数。

我已经找到了正确的解决方案,但是我不明白为什么我的解决方案有“大”输入的好时机而且“中等”不好。

这是我的解决方案:

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;
    }
}

结果的链接: https://codility.com/demo/results/demo8F8DDW-9BK/

1 个答案:

答案 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;                                                
}                                                                           
相关问题