给定未设置的集合A
什么是最有效的解决方案
用于查找不是x
元素的最小整数A
,使x
需要大于某个整数m
?
e.g。
输入:A = {7, 3, 4, 1}
,m = 5
输出:x = 6
我在C中搜索解决方案,但是任何类型的伪代码都会有帮助......这个问题可以在O(n)中解决,其中n是设置大小吗?
答案 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)。