查找不在数组中的最小整数

时间:2013-06-30 14:31:27

标签: c arrays algorithm

给定未设置的集合A什么是最有效的解决方案 用于查找不是x元素的最小整数A,使x需要大于某个整数m

e.g。

输入:A = {7, 3, 4, 1}m = 5

输出:x = 6

我在C中搜索解决方案,但是任何类型的伪代码都会有帮助......这个问题可以在O(n)中解决,其中n是设置大小吗?

3 个答案:

答案 0 :(得分:5)

我使用和额外的数组解决了它。这里'len'是数组的长度。

int findMin(int *arr,int n,int len)
{
    int *hash;
            if(len==0)
               {return -1;  //fail 
                }
    hash=(int*)calloc(len,sizeof(int)); //hash function I'm using is f(x)=f(x)-n;
    int i;
    for(i=0;i<len;i++){
        if(arr[i]>n && arr[i]<len+n){  //because max element can't be more than n
            hash[arr[i]-n]++;
        }
    }

    i=1;
    while(i<len){
        if(hash[i]==0)
            return len+i;
        i++;
    }
            return len+n+1;
}

这个灵魂的顺序是O(n)运行时间和O(n)空间。

答案 1 :(得分:3)

以下Java代码应该适合您:

public static int findMinNotInArray(int array[], int n) {
    int frequency[] = new int[array.length];

    if (n < max(array)) {
        for (int i = 0; i < array.length; i++) {
            if (array[i] > n && array[i] < n + array.length)
                frequency[array[i] - (n + 1)]++;
        }

        for (int i = 0; i < frequency.length; i++) {
            if (frequency[i] == 0)
                return i + n + 1;
        }
        return -1;
    } else {
        return n + 1;
    }
}

public static int max(int array[]) {
    int max = array[0];
    for (int i = 1; i < array.length; i++) {
        if (array[i] > max) {
            max = array[i];
        }
    }
    return max;
}

以上代码只是跟踪从n+1(n+1) + lengthOfA的数字,无论数组中是否存在此范围内的任何数字!并返回第一个非现在的数字!

答案 2 :(得分:1)

我认为,最可行的方法是先对数组进行排序。然后你可以对其中的m进行二进制搜索,然后线性搜索邻居不止一个的下一个点。

这种方法的复杂性是排序算法的复杂性,在大多数情况下就是O(nlogn)。