输入一个乱序的连续数列,输出其中最长连续数列长度,要求算法复杂度为 O(n) 。
54,55,300,12,56
3。
输入样例
100,4,200,1,3,2
54,55,300,12
1
5,4,3,2,1
1,2,3,4,5,6
输出样例
4
2
1
5
6
思路
将所有数都加入集合中,然后再遍历这些数,因为我们能O(1)的判断某个数是否在集合中,所以我们可以一个个向上或者向下检查。为了避免之后重复检查,我们每查到一个数,都要将其从集合中移除。这样每遇到一个数,都检查它的上下边界,就能找出最长的连续数列。时间复杂度仍是O(N),因为我们不会检查不存在于数组的数,而存在于数组的数也只会检查一次。
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func solution(line string) string {
// 在此处理单行数据
var maxLen int
m:=make(map[string]string)
strArray:=strings.Split(line,",")
for _,v:=range strArray{
m[v]=v
}
for _,v:=range strArray{
//寻找上边界
var len1 int
a,_:=strconv.Atoi(v)
for _,ok:=m[fmt.Sprintf("%v",a)];ok;{
//fun := func (c rune) bool {
// if string(c)!=fmt.Sprintf("%v",a){
// return false
// }
// return true
//}
len1++
delete(m,fmt.Sprintf("%v",a))
a++
_,ok=m[fmt.Sprintf("%v",a)]
}
//寻找下边界
b,_:=strconv.Atoi(v)
b=b-1
for _,ok:=m[fmt.Sprintf("%v",b)];ok;{
len1++
delete(m,fmt.Sprintf("%v",b))
b--
_,ok=m[fmt.Sprintf("%v",b)]
}
if len1>maxLen{
maxLen=len1
}
}
// 返回处理后的结果
return fmt.Sprintf("%v",maxLen)
}
func main() {
r := bufio.NewReaderSize(os.Stdin, 20480)
for line, _, err := r.ReadLine(); err == nil; line, _, err = r.ReadLine() {
fmt.Println(solution(string(line)))
}
}