87 lines
1.5 KiB
Go
87 lines
1.5 KiB
Go
package longest_consecutive_sequence
|
|
|
|
// type Node struct {
|
|
// // The location of the parent node.
|
|
// Parent *Node
|
|
|
|
// // The number of descendent nodes, including itself.
|
|
// Children int
|
|
// }
|
|
|
|
// func FindAncestor(n *Node) *Node {
|
|
// ancestor := n
|
|
|
|
// for ancestor.Parent != nil {
|
|
// ancestor = ancestor.Parent
|
|
// }
|
|
|
|
// return ancestor
|
|
// }
|
|
|
|
// func LongestConsecutive(nums []int) int {
|
|
// nodes := map[int]*Node{}
|
|
|
|
// for _, num := range nums {
|
|
// if _, exists := nodes[num]; exists {
|
|
// continue
|
|
// }
|
|
|
|
// node := &Node{Parent: nil, Children: 1}
|
|
|
|
// if lower, lower_exists := nodes[num-1]; lower_exists {
|
|
// ancestor := FindAncestor(lower)
|
|
// ancestor.Parent = node
|
|
// node.Children += ancestor.Children
|
|
// }
|
|
|
|
// if upper, lower_exists := nodes[num+1]; lower_exists {
|
|
// ancestor := FindAncestor(upper)
|
|
// ancestor.Parent = node
|
|
// node.Children += ancestor.Children
|
|
// }
|
|
|
|
// nodes[num] = node
|
|
// }
|
|
|
|
// maximum := 0
|
|
|
|
// for _, node := range nodes {
|
|
// maximum = max(maximum, node.Children)
|
|
// }
|
|
|
|
// return maximum
|
|
// }
|
|
|
|
func LongestConsecutive(nums []int) int {
|
|
items := map[int]bool{}
|
|
|
|
for _, num := range nums {
|
|
items[num] = true
|
|
}
|
|
|
|
maximum := 0
|
|
|
|
for item, unused := range items {
|
|
if !unused {
|
|
continue
|
|
}
|
|
|
|
items[item] = false
|
|
sequence := 1
|
|
|
|
for i := item - 1; items[i]; i-- {
|
|
items[i] = false
|
|
sequence++
|
|
}
|
|
|
|
for i := item + 1; items[i]; i++ {
|
|
items[i] = false
|
|
sequence++
|
|
}
|
|
|
|
maximum = max(maximum, sequence)
|
|
}
|
|
|
|
return maximum
|
|
}
|