Для заданного массива A размера n найдите количество троек (i, j, k), где i, j, k — индексы и (1 ‹= i ‹ j ‹ k ‹= N), таких, что в множестве [ A[i], A[j], A[k]] наибольшее число равно сумме оставшихся двух чисел.
Пример:
A: [2,5,7,12,19]
Number of
Triplet: 3
=> {2,5,7},{5,7,12},{7,12,19}
- Все три числа равны нулю. Количество способов подобрать такую пару по формуле простой комбинации nC3, где n — количество нулей.
- Два одинаковых числа с комбинацией нуля. Количество способов выбрать такую пару было бы, если количество нулей равно z. Итого такая пара будет z * nC2. Где n - количество повторяющихся чисел.
- Два одинаковых числа x со значением 2x в массиве. расчет будет таким же, как в случае с. то есть, если 2x count равен y. Итого такой парой будет y * nC2. Где n - количество повторяющихся чисел.
- Два различных числа с суммой, если число также находится в массиве. общая такая комбинация будет умножением числа
func countTriplets(array: [Int]) -> Int { var maxVal = 0 var frequencyMap: [Int: Int] = [:] for item in array { //sum of two number cannot exeed this maxVal = (maxVal > item) ? maxVal : item //repeat count of number if let oldFrequency = frequencyMap[item] { frequencyMap[item] = oldFrequency + 1 } else { frequencyMap[item] = 1 } } var tripletCount = 0 //1. if zero are more than 2 if let zeroCount = frequencyMap[0], zeroCount > 2 { tripletCount += (zeroCount * (zeroCount - 1) * (zeroCount - 3)) / (2*3) // nC3 } //2. if one zero -> 0, i , i if let zeroCount = frequencyMap[0], zeroCount != 0 { for (key,value) in frequencyMap { if key != 0, value > 1 { tripletCount += (zeroCount * value * (value - 1))/2 } } } //3. i,i,2i for (key,value) in frequencyMap { if key != 0, let doubleValue = frequencyMap[2 * key], value > 1 { tripletCount += (doubleValue * value * (value - 1))/2 } } //4. if i, j, i + j = k for (key,value) in frequencyMap { for (key2,value2) in frequencyMap { //key < key2 => to avoid duplicate cases if key != 0, key < key2, let sumValue = frequencyMap[key + key2] { tripletCount += (value * value2 * sumValue) } } } return tripletCount }