如何找到输入序列无法表示的最小数字

时间:2011-10-18 03:07:56

标签: algorithm

这是一个面试问题: 输入: 整数N;不同的正整数a1,a2 ... aN;

输出: 最小正整数m,不能以m = x1 * a1 + x2 * a2 + ... xN * aN的形式表示,其中xi = {0,1}。

3 个答案:

答案 0 :(得分:1)

天真的解决方案:

public static void calcAllSums(int[] arr, int sum, int curIndex, Hashtable<Integer,Boolean> sums){
    if (curIndex == arr.length) return;
    int sum1 = sum+arr[curIndex];
    int sum2 = sum;
    sums.put(sum1, true);
    sums.put(sum2, true);
    calcAllSums(arr, sum1, curIndex+1, sums);
    calcAllSums(arr, sum2, curIndex+1, sums);
}
public static void main(String[] args){
    int[] arr = {1,3,5};
    Hashtable<Integer,Boolean> sums = new Hashtable<Integer,Boolean>();
    calcAllSums(arr, 0, 0, sums);
    int i=0;
    while (sums.containsKey(i)) i++;
    System.out.println(i);
}

我计算了所有可能的总和,并迭代直到我找到一个不在列表中的整数

答案 1 :(得分:1)

对于速度极快的全数字3代码, 请参阅Aliaksei Safryhin的代码explanation at polygenelubricants.com。该系列 像

这样的陈述
*pTo++ += short(*pFrom++) << 8; *pTo++ += short(*pFrom++) << 8; 

可能看起来笨拙和缓慢,但在我的测试中运行的速度比移位位图方法快许多倍。另请参阅Al Zimmermann's Son of DartsHow can I improve this algorithm for solving a modified Postage Stamp puzzle?,如果您能找到2010年7月7日的John Morris的darts.pdf,它包含了一个相当快的枚举器代码,用于3到20个数字的首次丢失子集和

答案 2 :(得分:0)

由于两个连续数字之间的最小差异是a n 因子中的最小值,0表示,我会说

min n (a n ) - 1

当然,如果min n (a n )= 1,你可以对第二个到最小值进行类似的推理。