873. 最長的斐波那契子序列的長度 : 經(jīng)典序列 DP 運(yùn)用題

題目描述

這是 LeetCode 上的 873. 最長的斐波那契子序列的長度 摇锋,難度為 中等丹拯。

Tag : 「序列 DP」、「哈希表」荸恕、「動(dòng)態(tài)規(guī)劃」

如果序列 X_1, X_2, ..., X_n 滿足下列條件乖酬,就說它是 斐波那契式 的:

  • n >= 3
  • 對于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_{i+2}

給定一個(gè)嚴(yán)格遞增的正整數(shù)數(shù)組形成序列 arr融求,找到 arr 中最長的斐波那契式的子序列的長度咬像。如果一個(gè)不存在,返回 0 生宛。

(回想一下县昂,子序列是從原序列 arr 中派生出來的,它從 arr 中刪掉任意數(shù)量的元素(也可以不刪)陷舅,而不改變其余元素的順序倒彰。例如, [3, 5, 8][3, 4, 5, 6, 7, 8] 的一個(gè)子序列)

示例 1:

輸入: arr = [1,2,3,4,5,6,7,8]

輸出: 5

解釋: 最長的斐波那契式子序列為 [1,2,3,5,8] 莱睁。

示例 2:

輸入: arr = [1,3,7,11,12,14,18]

輸出: 3

解釋: 最長的斐波那契式子序列有 [1,11,12]待讳、[3,11,14] 以及 [7,11,18] 。

提示:

  • 3 <= arr.length <= 1000
  • 1 <= arr[i] < arr[i + 1] <= 10^9

序列 DP

定義 f[i][j] 為使用 arr[i] 為斐波那契數(shù)列的最后一位仰剿,使用 arr[j] 為倒數(shù)第二位(即 arr[i] 的前一位)時(shí)的最長數(shù)列長度创淡。

不失一般性考慮 f[i][j] 該如何計(jì)算,首先根據(jù)斐波那契數(shù)列的定義南吮,我們可以直接算得 arr[j] 前一位的值為 arr[i] - arr[j]琳彩,而快速得知 arr[i] - arr[j] 值的坐標(biāo) t,可以利用 arr 的嚴(yán)格單調(diào)遞增性質(zhì)旨袒,使用「哈希表」對坐標(biāo)進(jìn)行轉(zhuǎn)存汁针,若坐標(biāo) t 存在,并且符合 t < j砚尽,說明此時(shí)至少湊成了長度為 3 的斐波那契數(shù)列施无,同時(shí)結(jié)合狀態(tài)定義,可以使用 f[t][j] 來更新 f[i][j]必孤,即有狀態(tài)轉(zhuǎn)移方程:

f[i][j] = \max(3, f[j][t] + 1)

同時(shí)猾骡,當(dāng)我們「從小到大」枚舉 i瑞躺,并且「從大到小」枚舉 j 時(shí),我們可以進(jìn)行如下的剪枝操作:

  • 可行性剪枝:當(dāng)出現(xiàn) arr[i] - arr[j] >= arr[j]兴想,說明即使存在值為 arr[i] - arr[j] 的下標(biāo) t幢哨,根據(jù) arr 單調(diào)遞增性質(zhì),也不滿足 t < j < i 的要求嫂便,且繼續(xù)枚舉更小的 j捞镰,仍然有 arr[i] - arr[j] >= arr[j],仍不合法毙替,直接 break 掉當(dāng)前枚舉 j 的搜索分支岸售;
  • 最優(yōu)性剪枝:假設(shè)當(dāng)前最大長度為 ans,只有當(dāng) j + 2 > ans厂画,我們才有必要往下搜索凸丸,j + 2 的含義為以 arr[j] 為斐波那契數(shù)列倒數(shù)第二個(gè)數(shù)時(shí)的理論最大長度。

代碼:

class Solution {
    public int lenLongestFibSubseq(int[] arr) {
        int n = arr.length, ans = 0;
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < n; i++) map.put(arr[i], i);
        int[][] f = new int[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = i - 1; j >= 0 && j + 2 > ans; j--) {
                if (arr[i] - arr[j] >= arr[j]) break;
                int t = map.getOrDefault(arr[i] - arr[j], -1);
                if (t == -1) continue;
                f[i][j] = Math.max(3, f[j][t] + 1);
                ans = Math.max(ans, f[i][j]);
            }
        }
        return ans;
    }
}
  • 時(shí)間復(fù)雜度:存入哈希表復(fù)雜度為 O(n)袱院;DP 過程復(fù)雜度為 O(n^2)屎慢。整體復(fù)雜度為 O(n^2)
  • 空間復(fù)雜度:O(n^2)

最后

這是我們「刷穿 LeetCode」系列文章的第 No.873 篇,系列開始于 2021/01/01忽洛,截止于起始日 LeetCode 上共有 1916 道題目腻惠,部分是有鎖題,我們將先把所有不帶鎖的題目刷完脐瑰。

在這個(gè)系列文章里面妖枚,除了講解解題思路以外,還會(huì)盡可能給出最為簡潔的代碼苍在。如果涉及通解還會(huì)相應(yīng)的代碼模板绝页。

為了方便各位同學(xué)能夠電腦上進(jìn)行調(diào)試和提交代碼,我建立了相關(guān)的倉庫:https://github.com/SharingSource/LogicStack-LeetCode 寂恬。

在倉庫地址里续誉,你可以看到系列文章的題解鏈接、系列文章的相應(yīng)代碼初肉、LeetCode 原題鏈接和其他優(yōu)選題解酷鸦。

更多更全更熱門的「筆試/面試」相關(guān)資料可訪問排版精美的 合集新基地 ????

本文由mdnice多平臺發(fā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市牙咏,隨后出現(xiàn)的幾起案子臼隔,更是在濱河造成了極大的恐慌,老刑警劉巖妄壶,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摔握,死亡現(xiàn)場離奇詭異,居然都是意外死亡丁寄,警方通過查閱死者的電腦和手機(jī)氨淌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門泊愧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盛正,你說我怎么就攤上這事删咱。” “怎么了豪筝?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵痰滋,是天一觀的道長。 經(jīng)常有香客問我续崖,道長即寡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任袜刷,我火速辦了婚禮,結(jié)果婚禮上莺丑,老公的妹妹穿的比我還像新娘著蟹。我一直安慰自己,他們只是感情好梢莽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布萧豆。 她就那樣靜靜地躺著,像睡著了一般昏名。 火紅的嫁衣襯著肌膚如雪涮雷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天轻局,我揣著相機(jī)與錄音洪鸭,去河邊找鬼。 笑死仑扑,一個(gè)胖子當(dāng)著我的面吹牛览爵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播镇饮,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蜓竹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了储藐?” 一聲冷哼從身側(cè)響起俱济,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钙勃,沒想到半個(gè)月后蛛碌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肺缕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年左医,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了授帕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浮梢,死狀恐怖跛十,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情秕硝,我是刑警寧澤芥映,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站远豺,受9級特大地震影響奈偏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜躯护,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一惊来、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棺滞,春花似錦裁蚁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至移必,卻和暖如春室谚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背崔泵。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工秒赤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人管削。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓倒脓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親含思。 傳聞我的和親對象是個(gè)殘疾皇子崎弃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容