给定一个整数数组 A
,返回 A
中最长等差子序列的长度。
回想一下,A
的子序列是列表 A[i_1], A[i_2], ..., A[i_k]
其中 0 <= i_1 < i_2 < ... < i_k <= A.length - 1
。并且如果 B[i+1] - B[i]
( 0 <= i < B.length - 1
) 的值都相同,那么序列 B
是等差的。
提示:
2 <= A.length <= 2000
0 <= A[i] <= 10000
用Go语言写点算法题,熟悉一下这门语言吧~
这道题最好的写法应该是动态规划,而且对使用空间什么的有比较好的优化。
我在这就不讲这些了,能使用Go顺利写出就可以了。
【思路】对每个遍历经过的数字都建立一个diff:len的map,相当于动态规划,但由于用到了map(Go语言里map都是指hashmap),运算时间一般般。时间复杂度还是O(n^2),比暴力求解还是好上不少的。
代码:
func longestArithSeqLength(A []int) int { if len(A)<= 2 { return len(A) } size := len(A) var dict []map[int]int dict = make([]map[int]int,size)//map的slice和map都需要make初始化这一点让我很不习惯 dict[0] = make(map[int]int) for i := 1; i<size;i++{ dict[i] = make(map[int]int) for j:=i-1;j>=0; j--{ diff := A[i] - A[j] if dict[j][diff] + 1>dict[i][diff] {//这里需要判断,否则会产生一个bug dict[i][diff] = dict[j][diff] + 1 } } } res := 2 for index:=1;index<size;index++{ for _,v := range dict[index]{ if v>=res{ res = v+1 } } } return res }