Для заданного массива 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}
  1. Все три числа равны нулю. Количество способов подобрать такую ​​пару по формуле простой комбинации nC3, где n — количество нулей.
  2. Два одинаковых числа с комбинацией нуля. Количество способов выбрать такую ​​пару было бы, если количество нулей равно z. Итого такая пара будет z * nC2. Где n - количество повторяющихся чисел.
  3. Два одинаковых числа x со значением 2x в массиве. расчет будет таким же, как в случае с. то есть, если 2x count равен y. Итого такой парой будет y * nC2. Где n - количество повторяющихся чисел.
  4. Два различных числа с суммой, если число также находится в массиве. общая такая комбинация будет умножением числа
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
}