检查随机数列表是否包含1到n范围的有效方法

时间:2011-09-30 23:18:09

标签: algorithm range

如果我有一个随机改组的数字,其数字为1到n,那么找到数组包含范围1到n(没有重复)的好方法是什么?例如,

n = 6; [1, 3, 6, 2, 4, 5] => true
n = 6; [1, 1, 2, 4, 5, 6] => false

5 个答案:

答案 0 :(得分:3)

听起来很像家庭作业,但是......

使用Set:

非常简单
/* Convert to your favorite language */

validateArray(a, n) {
  assertEqual(n, a.length)
  def s = new Set(a); // set with all elements of a
  assertEqual(s, Set(1..n)); // should be equal to set containing 1 to n
}

答案 1 :(得分:2)

创建一个大小为n的数组,通过数组并使用该数组作为索引递增数组中的位置。如果在任何时候计数数组具有非0或非1值,则可以停止。如果你找不到索引,你可以立即停止,因为你知道你没有索引。

这是一个快速的Java示例。在这个例子中,你不需要在最后计算,因为任何会导致非1值的东西都会在中间导致失败。

boolean isRange(int[] arr) {

    int[] counts = new int[arr.length];

    for(int i : arr) {
        if(i < 1 || i > arr.length) return false;
        if(counts[i - 1] != 0) return false;
        counts[i-1] = 1;
    }
    return true; // if it wasn't, we would have failed by now

}

答案 2 :(得分:0)

使用高斯公式预先计算最终总和:

final_sum = k * (k+1)
            ---------
                2

在洗牌后的列表上进行线性循环,随时添加数字,如果您的运行总和与最终总和相同,则返回true。

答案 3 :(得分:0)

您将要对数组进行排序。以下是一些热门选择http://en.wikipedia.org/wiki/Sorting_algorithm的链接。我个人建议使用冒泡排序来获得一个简单的解决方案,并合并排序以获得更难,更快的版本。

列表排序后,您可以通过迭代数组并确保下一个#大于前一个来检查重复。此外,这可以添加到排序中以缩短计算时间。

最后,检查第一个和最后一个数字,确保它们等于1和n。

答案 4 :(得分:0)

如果不允许额外空间(面试问题中的典型约束),则可以先对数组进行排序,然后从左到右依次扫描排序后的数组,以查看每个元素是否比前一个元素大1。时间复杂度为O(n * logn)。