1. 程式人生 > >leetcode.1027 Longest Arithmetic Sequence 最長等差數列

leetcode.1027 Longest Arithmetic Sequence 最長等差數列

初始 dex enc ... 判斷 map 讓我 優化 pre

給定一個整數數組 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 最長等差數列