Вопросы и замечания по курсу Алгоритмы И Структуры Данных

swift
ios

#1

Начал проходить и появился ряд вопросов, замечаний.
Думаю буду дополнять тему по мере появления новых.
Хотелось бы услышать мнение тех кто проходил курс, либо просто разбираются в теме.

Урок 4. Удалить дубликаты из отсортированного массива

Препод предлагает сделать цикл через while для того чтобы удалять дубликаты

func removeDuplicates(arr: inout [Int]) {
  var previous: Int? = nil
  var index = 0

  while index < arr.count {
    let elem = arr[index]
    if elem == previous {
        arr.remove(at: index)
    } else {
        index += 1
        previous = elem
    }
  }
}

Но насколько я понимаю после удаления элемента весь массив должен перестроиться и вместо сложности O(n) мы получаем сложность O(n*n)
Мне кажется эффективней использовать цикл for и возвращать новый массив, либо присваивать его параметру inout


#2

Есть зависимость памяти и скорости выполнения.
В этом случае не используется дополнительная память, но увеличивается сложность.

Причем тут for не очень понятно)
Цикл можете представлять как вам удобно)


#3

Просто через for нельзя сделать удаление элементов. Он ломается от этого.
Насчет любого цикла какого удобно тоже бы поспорил, например в codestyle raywenderlich прямо указано, что for более предпочтителен.
В принципе согласен, версия с удалением элементов больше выигрывает по памяти.


#4

ничего не сломалось)

func removeDuplicates(arr: inout [Int]) {
    var previous: Int? = nil
    var index = 0
    
    for _ in 0..<arr.count {
        let elem = arr[index]
        if elem == previous {
            arr.remove(at: index)
        } else {
            index += 1
            previous = elem
        }
    }
}

var array = (0...100).map { _ in Int.random(in: 0...5) }
array.sort()
removeDuplicates(arr: &array)

print(array)

#5

Ну да согласен, так работает.
Я просто взял цикл из предыдущей задачи с ним ломается

for (index, elem) in arr.enumerated()