Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // MARK: - Найти МАКСИМАЛЬНЫЙ подотрезок суммой X
- func subarraySumXMAX(_ nums: [Int], _ x: Int) -> [Int] {
- var prefix = [0:-1]
- var sum = 0
- var maxlength = 0
- var maxIndeces = (start:-1, end:-1)
- for r in 0..<nums.count {
- sum += nums[r]
- var prefixForDelete = sum - x
- if prefix[prefixForDelete] != nil {
- let start = prefix[prefixForDelete]!+1
- let end = r
- if end - start + 1 > maxlength {
- maxlength = end - start + 1
- maxIndeces.start = start
- maxIndeces.end = end
- }
- }
- // нужно чтобы не сужался если получилось, что сумма уже была
- // нам надо как можно больше отрезок, поэтому лучше выкинуть то что он ншел ранее
- if prefix[sum] == nil {
- prefix[sum] = r
- }
- }
- return Array(nums[maxIndeces.start...maxIndeces.end])
- }
- subarraySumXMAX([1,2,0,-5,5,4,5,0,0, 0, 0, 1, 0, 1, 1], 12)
- subarraySumXMAX([1,0,5,6, 0, 0, 0, 1, 1, 1, 1, 1, 1,0,0, 1, 1, 1, 1, 1, 3], 11)
- subarraySumXMAX([1,2,3,4,5,0], 12)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement