Advertisement
Alexxik

Untitled

Sep 9th, 2023 (edited)
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 1.90 KB | None | 0 0
  1. // MARK: - 380. Insert Delete GetRandom O(1)
  2.  
  3. import Foundation
  4.  
  5. class RandomizedSet {
  6.     // Число - ключ, индекс в массиве - заначение
  7.     var numDict: [Int:Int]
  8.     var numList: [Int]
  9.  
  10.     init() {
  11.         numDict = [:]
  12.         numList = []
  13.     }
  14.    
  15.     func insert(_ val: Int) -> Bool {
  16.         // Значение присутствует, тогда возвращаем isIn = true, иначе false
  17.         let isNotIn = numDict[val] == nil ? true : false
  18.        
  19.         if isNotIn {
  20.             // Значение - это в конец нашего листа
  21.             numDict[val] = numList.count
  22.             numList.append(val)
  23.         }
  24.        
  25.         return isNotIn
  26.     }
  27.    
  28.    
  29.     // работает и для массива где 1 элемент
  30.     func remove(_ val: Int) -> Bool {
  31.         // Нужно чтобы значение было в словаре
  32.         let isIn = self.numDict[val] != nil ? true : false
  33.        
  34.         if isIn {
  35.             // получим индекс по которому надо удалить из листа
  36.             let index = numDict[val]
  37.             // теперь нужно взять последнее значение в массиве и перетащить на этот индекс
  38.             let lastValue = numList.last!
  39.             numList[index!] = lastValue
  40.             numList.popLast()
  41.             // Меняем значение в словаре для "последнего" элемента
  42.             numDict[lastValue] = index
  43.             // удалим значение из словаря - обязательно только в конце!!!
  44.             numDict[val] = nil
  45.         }
  46.         return isIn
  47.     }
  48.    
  49.     func getRandom() -> Int {
  50.         let randomIndex = Int.random(in: 0..<numList.count)
  51.         return numList[randomIndex]
  52.     }
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement