lc-go/solutions/37/q3719/solution.go
2026-02-17 14:25:55 +09:00

53 lines
961 B
Go

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