54 lines
1 KiB
Go
54 lines
1 KiB
Go
// Package q3719 implements a solution for https://leetcode.com/problems/longest-balanced-subarray-i/
|
|
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
|