Update: Simpler solution: Split the array into slices of
positive elements, and determine the maximal slice length:
let numbers = [1,3,4,-1,-2,5,2,-2,-3,-4,5]
let maxConsecutive = numbers.split(whereSeparator: { $0 <= 0 }).map { $0.count }.max()!
print(maxConsecutive) // 3
Old answer:) Using the ideas from Swift running sum:
let numbers = [1,3,4,-1,-2,5,2,-2,-3,-4,5]
let maxConsecutive = numbers.map({
() -> (Int) -> Int in var c = 0; return { c = $0 > 0 ? c + 1 : 0; return c }
}()).max()!
Here map()
maps each array element to the count of consecutive positive
numbers up to the elements position, in this case
[1, 2, 3, 0, 0, 1, 2, 0, 0, 0, 1]
The transformation is created as an "immediately evaluated
closure" to capture a variable c
which holds the current number of
consecutive positive numbers. The transformation increments or resets c
,
and returns the updated value.
If the array is possibly large then change it to
let maxConsecutive = numbers.lazy.map( ... ).max()!
so that the maximum run length is determined without creating an
intermediate array.