Advertisement
Alexxik

Untitled

Sep 16th, 2023 (edited)
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 1.26 KB | None | 0 0
  1. // MARK: - Найти МАКСИМАЛЬНЫЙ подотрезок суммой X
  2.  
  3. func subarraySumXMAX(_ nums: [Int], _ x: Int) -> [Int] {
  4.     var prefix = [0:-1]
  5.     var sum = 0
  6.     var maxlength = 0
  7.     var maxIndeces = (start:-1, end:-1)
  8.    
  9.     for r in 0..<nums.count {
  10.         sum += nums[r]
  11.        
  12.         var prefixForDelete = sum - x
  13.        
  14.         if prefix[prefixForDelete] != nil {
  15.             let start = prefix[prefixForDelete]!+1
  16.             let end = r
  17.             if end - start + 1 > maxlength {
  18.                 maxlength = end - start + 1
  19.                 maxIndeces.start = start
  20.                 maxIndeces.end = end
  21.             }
  22.         }
  23.         // нужно чтобы не сужался если получилось, что сумма уже была
  24.         // нам надо как можно больше отрезок, поэтому лучше выкинуть то что он ншел ранее
  25.         if prefix[sum] == nil {
  26.             prefix[sum] = r
  27.         }
  28.     }
  29.    
  30.     return Array(nums[maxIndeces.start...maxIndeces.end])
  31. }
  32.  
  33. subarraySumXMAX([1,2,0,-5,5,4,5,0,0, 0, 0, 1, 0, 1, 1], 12)
  34. subarraySumXMAX([1,0,5,6, 0, 0, 0, 1, 1, 1, 1, 1, 1,0,0, 1, 1, 1, 1, 1, 3], 11)
  35. subarraySumXMAX([1,2,3,4,5,0], 12)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement