Вопрос: Напишите функцию, которая возвращает триплеты, суммирующиеся с заданной целью, или ноль, если они отсутствуют.

Например: [1] и 3, вы должны вернуть nil,

Например, учитывая [2, 4, 5, 6] и 3, вы должны вернуть nil,

Например, учитывая [2, 4, 5, 1] ​​и 7, вы должны вернуть (2, 4, 1)).

Подсказки:

- если длина массива меньше трех, мы не можем найти триплеты,

- Брут for - это тройной цикл for,

- Вы можете сделать это за O(n²) без дополнительного места.

Решение:

func threeSum(array: [Int], sum: Int) -> (Int, Int, Int)? {
    // 1.
    guard array.count > 2 else { return nil }

    // 2.
    for i in 0..<array.count {
        // 3.
        var j = 1
        var k = array.count - 1
        // 4.
        while j < k {
            let a = array[i]
            let b = array[j]
            let c = array[k]
            if  a + b + c == sum, i != j, i != k {
                // 5.
                return (a, b, c)
            }
            // 6.
            j += 1
            k -= 1
        }
    }
    // 7.
    return nil
}

Пояснения:

1. Если элементов меньше трех, триплетов не найти; вернуть ноль.

guard array.count > 2 else { return nil }

2. Пройдемся по всем элементам (индекс i).

for i in 0..<array.count {

3. Давайте используем еще два индекса, j и k, j инициализируется единицей, а k инициализируется последним индексом массива.

var j = 1
var k = array.count - 1

4. Зацикливаемся до тех пор, пока j не будет меньше k.

while j < k {

5. Если три элемента с индексами i, j и k в сумме дают цель, а i, j и k разные индексы, мы нашли тройку, то возвращаем элементы.

let a = array[i]
let b = array[j]
let c = array[k]
if a + b + c == sum, i != j, i != k {
  return (a, b, c)

6. В противном случае уменьшите диапазон, увеличив j и уменьшив k.

j += 1
k -= 1

7. Мы не нашли ни одной тройки; вернуть ноль.

return nil

Сложность:

- Временная сложность: поскольку мы повторяем массив n раз, пространственная сложность составляет O (n ^ 2),

- Пространственная сложность: поскольку мы используем только три целых числа, пространственная сложность постоянна O (1).

Тест-кейсы:

public func testThreeSum() {
  assert(threeSum(array: [1], sum: 3) == nil, "threeSum 1 not equal")
  assert(threeSum(array: [2, 4, 5, 6], sum: 3) == nil, "threeSum 2 not equal")
  assert(threeSum(array: [2, 4, 5, 1], sum: 7)! == (2, 4, 1), "threeSum 3 not equal")
}

Следовать за:

Нет дополнительного вопроса.

‹‹ Структуры данных, алгоритмы и вопросы для интервью ››



Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 💰 Бесплатный курс собеседования по программированию ⇒ Просмотреть курс
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу