【发布时间】:2019-06-07 21:54:09
【问题描述】:
给定一个数组,你如何找到加起来为 60 或可被 60 整除的数对(两个值)的数量。注意:必须比 O(N^2) 快。
输入:[10, 50, 30, 90] 输出:2 推理:10+50 = 60, 30 + 90 = 120(120能被60整除)
输入:[60,60,60] 输出:3 推理:60 + 60 = 120, 60 + 60 = 120, 60 + 60 = 120
我下面的代码将在 O(N) 时间内运行,但我不知道如何处理彼此相等的对(即,如果数组中有 2 30 个值将加 1到您的计数器,但如果数组中有 3 30 个值,则会将 3 添加到您的计数器)。我想我应该创建一个组合函数(即 2C2 或 3C2),但那是一个线性函数,不会让函数回到 O(N^2) 吗?
values(myList) {
var obj = {};
var count = 0;
// loop through array and mod each value and insert it into a dictionary
myList.forEach((elem, index) => {
if (!obj.hasOwnProperty(elem % 60)) {
obj[elem % 60] = 1;
} else {
obj[elem % 60]++;
}
});
for (var keys in obj) {
if (obj.hasOwnProperty(60 - keys)) {
if (60 - keys == keys) {
// take care of pairs
// obj[keys] = x --> xC2
} else {
count += Math.min(obj[keys], obj[60 - keys]);
delete obj[keys]
delete obj[60 - keys];
}
}
}
return count;
}
【问题讨论】:
-
组合函数的线性实现是可以的,因为它相对于它所代表的元素数量是线性的。所以你在组合函数内部要做的工作越多,它运行的就越少。
-
您的问题标题似乎具有误导性。它说“找到...的所有对”,但是在您的示例中,您似乎想要“找到...的对数”。请澄清。
-
请记住,“obj.hasOwnProperty”也不是免费调用。随着房产数量的增加,它会变得更加昂贵。
标签: javascript algorithm time-complexity big-o