package q3719 var seen [6000]bool func longestBalanced(nums []int) int { // Map numbers to reduce the range mapped := make(map[int]int, len(nums)) nextEven, nextOdd := 0, 1 for i := range nums { if m, ok := mapped[nums[i]]; ok { nums[i] = m } else if nums[i]%2 == 0 { mapped[nums[i]] = nextEven nums[i] = nextEven nextEven += 2 } else { mapped[nums[i]] = nextOdd nums[i] = nextOdd nextOdd += 2 } } numRange := max(nextEven, nextOdd) copy(seen[:3000], seen[3000:]) // init longest := 0 for i := 1; i < len(nums); i++ { copy(seen[:numRange], seen[numRange:]) // reset odd, even := 0, 0 for j := i; j >= 0; j-- { num := nums[j] if seen[num] { if even == odd { longest = max(longest, i-j+1) } continue } seen[num] = true if num%2 == 0 { even++ } else { odd++ } if even == odd { longest = max(longest, i-j+1) } } } return longest } var _ = longestBalanced