最长连续序列
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9
func longestConsecutive(nums []int) int {
// 做了一个set
countSet := make(map[int]struct{})
for i := range nums {
// 将数据存入set
countSet[nums[i]] = struct{}{}
}
maxCount := 0
for i := range countSet {
count := 1
numberAddFlag, numberSubFlag := true, true
// 删除对应的set
delete(countSet, i)
for number := 1; numberAddFlag || numberSubFlag; number++ {
if numberAddFlag {
if _, ok := countSet[i+number]; ok {
// 能够查询到
count++
delete(countSet, i+number)
} else {
numberAddFlag = false
}
}
if numberSubFlag {
if _, ok := countSet[i-number]; ok {
// 能够查询到
count++
delete(countSet, i-number)
} else {
numberSubFlag = false
}
}
}
if maxCount < count {
maxCount = count
}
}
return maxCount
}
func longestConsecutive(nums []int) int {
// 做了一个set
countSet := make(map[int]struct{})
for i := range nums {
// 将数据存入set
countSet[nums[i]] = struct{}{}
}
maxCount := 0
for i := range countSet {
count := 1
if _, ok := countSet[i-1]; ok {
// 能够查询到, 不是第一个
continue
}
// 这里是第一个
for j := 1; true; j++ {
if _, ok := countSet[i+j]; ok {
// 能够查询到第二个, 增加累计数
count++
} else {
break
}
}
if maxCount < count {
maxCount = count
}
}
return maxCount
}
// 这个没通过测试 用的是bite数组吧相当于 这个速度应该很快 但是内存消耗绝对会很大
func longestConsecutive(nums []int) int {
if len(nums) == 0 {
return 0
}
minNum, maxNum := math.MaxInt32, math.MinInt32
for i := range nums {
if nums[i] < minNum {
minNum = nums[i]
}
if nums[i] > maxNum {
maxNum = nums[i]
}
}
boolArray := make([]bool, maxNum-minNum+1)
for i := range nums {
boolArray[nums[i]-minNum] = true
}
var countMax int = 0
var count int = 0
for i := range boolArray {
if boolArray[i] {
count++
} else {
if countMax < count {
countMax = count
}
count = 0
}
}
if countMax < count {
return count
}
return countMax
}