首页 > 其他 > 详细

leetcode.1027 Longest Arithmetic Sequence 最长等差数列

时间:2019-05-14 01:08:21      阅读:274      评论:0      收藏:0      [点我收藏+]

给定一个整数数组 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 是等差的。

提示:

  1. 2 <= A.length <= 2000
  2. 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
}

 

leetcode.1027 Longest Arithmetic Sequence 最长等差数列

原文:https://www.cnblogs.com/J1ac/p/10859875.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!