如果我有一个随机改组的数字,其数字为1到n,那么找到数组包含范围1到n(没有重复)的好方法是什么?例如,
n = 6; [1, 3, 6, 2, 4, 5] => true
n = 6; [1, 1, 2, 4, 5, 6] => false
答案 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)。