Чтобы решить эту динамическую проблему
Попробуйте сохранить результат в Object
скажем, sum_map
, если найден, это означает, что мы уже вычислили эту сумму, если не рассчитать сумму, и сохраняем результат в карте дляссылка на будущее.
образец фрагмента:
let d = [1, 3, 2, 6, 1, 2]
const len = d.length
const sum_map = {}
let pairs = 0
for (let i = 0; i < d.length - 1; i++) {
for (let j = i + 1; j < d.length; j++) {
const key1 = `${d[i]}_${d[j]}`
const key2 = `${d[j]}_${d[i]}`
let result = 0
if (sum_map[key1]) {
result = sum_map[key1]
} else if (sum_map[key2]) {
result = sum_map[key2]
} else {
result = d[j] + d[i]
sum_map[`${d[i]}_${d[j]}`] = result
}
if (result % 3 === 0) {
pairs += 1
}
}
}
console.log(pairs)
Чтобы избежать O (n ^ 2), нужно просто уловить, что
Пример
допустим, число, с которым вы проверяете, равно 5 и arr = [1,3,2,6,1,2,5]
- вы найдете суммы, кратные числу, только если его числа дополняют остаток
, как, например, пара чисел, делимая на 5, это только те, которые дают остаток комплимента, т.е. 3 % 5 = 2
и 2 % 5 = 3
, поэтому сумма будет делиться на 5
так что для решения этой проблемы просто найдите остатки комплимента и выберите из них
, например, скажем, что вы 3 числа, дающие остаток 2, и 4 числа, дающие остаток 3
, поэтому пары выберут 1 из этих 3 чисел *выберите 1 из этих 4 чисел
если число делится на 5, но если его только 1, то его сумма никогда не будет делиться.
фрагмент кода:
let d = [1, 3, 2, 6, 1, 2, 5]
const check_div_num = 5
remainder_map = {}
mod_arr = d.map((i) =>{
const rem = i % 5
if(remainder_map[rem]) {
remainder_map[rem] += 1
} else {
remainder_map[rem] = 1
}
return rem
})
const till = Math.floor(check_div_num / 2)
keys = Object.keys(remainder_map)
let pairs = 0
for (let j = 0; j < keys.length; j++) {
const key = keys[j]
if(key === '0' && remainder_map["0"] > 1) {
pairs += remainder_map[key] / 2
continue
}
if(Number(key) <= till) {
let compliment = remainder_map[check_div_num - Number(key)]
const compliemnt_key = check_div_num - Number(key)
if(compliment) {
pairs += remainder_map[key]*remainder_map[compliemnt_key.toString()]
} else {
continue
}
} else {
break
}
}
console.log(pairs)
учти, я повторяюсь только до половиныиз 5 т.е. Math.floor (5/2), так как мы уже проверяем их комплимент