• 描述

输入一个乱序的连续数列,输出其中最长连续数列长度,要求算法复杂度为 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
  • go实现

思路

将所有数都加入集合中,然后再遍历这些数,因为我们能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)))
	}
}