如何找到范围1到K的N个数字(作为数组输入)的倍数,其中1 上述程序因大数K而失败。例如,如果 因此,在1至5的范围内,2或3或4的多个总数为3
function findNumberOfMultiples(inputArray, maxSize) {
var count = 0;
var tempArray = [];
for (var i=0; i<maxSize; i++){
tempArray[i] = 0;
}
for (var j=0; j<inputArray.length; j++) {
for (var i=1; i<=maxSize; i++) {
if (i % inputArray[j]) {
tempArray[i-1] = 1;
}
}
}
for (var i=0; i<maxSize; i++) {
if (tempArray[i]==1) {
count++;
}
}
return count;
}
inputArray = [2,3,4]
和maxSize(k)
为5
,
答案 0 :(得分:2)
你可以在O(N ^ 2)中解决这个问题,其中N是数组中元素的数量。
让我们假设你的数组中有两个元素[a1,a2],范围是K
你的答案是=&gt;
K/a1 + K/a2 - K/lcm(a1,a2) // because you added them in both a1 and a2
所以如果你有a1,.....ax
个元素,你的答案就是
K/a1+.....K/ax - K/lcm(ai,aj) (you have to replace i,j by (n*n-1)/2 combinations.
你必须做K/lcm(ai,aj)
O(N ^ 2)次(确切地说是(n * n-1)/ 2次)。因此,算法复杂度将为O(N ^ 2)(将存在Log(min(ai,aj))因子,但这对整体复杂性没有太大影响)。
这将适用于任何K
,因为它只取决于您的输入数组大小。
public int combinations(int K, int[] input){
int total = 0;
for(int i=0;i<input.length;i++){
total = total + Math.floor(K/input[i]);
}
for(int i=0;i<input.length;i++){
for(int j=i+1;j<input.length;j++){
if(i!=j){
int lcm =lcmFind(input[i], input[j]);
total = total - Math.floor(K/lcm);
}
}
}
return total;
}
您提供的测试用例:
答案 1 :(得分:1)
这个功能似乎可以解决问题:
var findMultiplesLength = function(arrayInput, max) {
var globalMultiples = [];
for (var j = 0; j < arrayInput.length; j++) {
var x = arrayInput[j];
var n = max / x;
for (var i=1; i < n; i++) {
mult = i * x;
if (globalMultiples.indexOf(mult) === -1) {
globalMultiples.push(mult);
}
}
}
return globalMultiples.length;
};
编辑:您不会有任何堆栈错误,但为该范围选择大值可能会挂起您的浏览器。