LeetCode #873 Length of Longest Fibonacci Subsequence 最長的斐波那契子序列的長度

873 Length of Longest Fibonacci Subsequence 最長的斐波那契子序列的長度

Description:
A sequence x1, x2, ..., xn is Fibonacci-like if:

n >= 3
xi + xi+1 == xi+2 for all i + 2 <= n
Given a strictly increasing array arr of positive integers forming a sequence, return the length of the longest Fibonacci-like subsequence of arr. If one does not exist, return 0.

A subsequence is derived from another sequence arr by deleting any number of elements (including none) from arr, without changing the order of the remaining elements. For example, [3, 5, 8] is a subsequence of [3, 4, 5, 6, 7, 8].

Example:

Example 1:

Input: arr = [1,2,3,4,5,6,7,8]
Output: 5
Explanation: The longest subsequence that is fibonacci-like: [1,2,3,5,8].

Example 2:

Input: arr = [1,3,7,11,12,14,18]
Output: 3
Explanation: The longest subsequence that is fibonacci-like: [1,11,12], [3,11,14] or [7,11,18].

Constraints:

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

題目描述:
如果序列 X_1, X_2, ..., X_n 滿足下列條件赏僧,就說它是 斐波那契式 的:

n >= 3
對于所有 i + 2 <= n玩讳,都有 X_i + X_{i+1} = X_{i+2}
給定一個嚴格遞增的正整數(shù)數(shù)組形成序列 arr 篮幢,找到 arr 中最長的斐波那契式的子序列的長度下面。如果一個不存在唠亚,返回 0 帝际。

(回想一下餐禁,子序列是從原序列 arr 中派生出來的诵肛,它從 arr 中刪掉任意數(shù)量的元素(也可以不刪)镀虐,而不改變其余元素的順序箱蟆。例如, [3, 5, 8] 是 [3, 4, 5, 6, 7, 8] 的一個子序列)

示例 :

示例 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

思路:

動態(tài)規(guī)劃
dp 記錄以 arr[i], arr[j] 結(jié)尾的最長斐波拉契子數(shù)列的長度
m 記錄下標對應(yīng)的值, 方便快速查找
如果油用完了還不能到達 target 返回 -1
時間復(fù)雜度為 O(n ^ 2), 空間復(fù)雜度為 O(nlgm), 其中 m = max(arr)

代碼:
C++:

class Solution 
{
public:
    int lenLongestFibSubseq(vector<int>& arr) 
    {
        int n = arr.size(), result = 0;
        unordered_map<int, int> m, dp;
        for (int i = 0; i < n; i++) m[arr[i]] = i;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < i; j++) 
            {
                if (arr[i] - arr[j] < arr[j] and m.count(arr[i] - arr[j])) 
                {
                    int k = m[arr[i] - arr[j]];
                    dp[j * n + i] = dp[k * n + j] + 1;
                    result = max(result, dp[j * n + i] + 2);
                }
            }
        }
        return result > 2 ? result : 0;
    }
};

Java:

class Solution {
    public int lenLongestFibSubseq(int[] arr) {
        int n = arr.length, result = 0;
        Map<Integer, Integer> m = new HashMap<>(), dp = new HashMap<>();
        for (int i = 0; i < n; i++) m.put(arr[i], i);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if (arr[i] - arr[j] < arr[j] && m.containsKey(arr[i] - arr[j])) {
                    int k = m.get(arr[i] - arr[j]);
                    dp.put(j * n + i, dp.getOrDefault(k * n + j, 0) + 1);
                    result = Math.max(result, dp.getOrDefault(j * n + i, 0) + 2);
                }
            }
        }
        return result > 2 ? result : 0;
    }
}

Python:

class Solution:
    def lenLongestFibSubseq(self, arr: List[int]) -> int:
        n, result, m, dp = len(arr), 0, { v: i for i, v in enumerate(arr) }, defaultdict(int)
        for i in range(n):
            for j in range(i):
                if (cur := arr[i] - arr[j]) < arr[j] and cur in m:
                    dp[j * n + i], result = dp[m[cur] * n + j] + 1, max(result, dp[m[cur] * n + j] + 3)
        return result if result > 2 else 0
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恨旱,一起剝皮案震驚了整個濱河市抄肖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窖杀,老刑警劉巖漓摩,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異入客,居然都是意外死亡管毙,警方通過查閱死者的電腦和手機腿椎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夭咬,“玉大人啃炸,你說我怎么就攤上這事∽慷妫” “怎么了南用?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長掏湾。 經(jīng)常有香客問我裹虫,道長,這世上最難降的妖魔是什么融击? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任筑公,我火速辦了婚禮,結(jié)果婚禮上尊浪,老公的妹妹穿的比我還像新娘匣屡。我一直安慰自己,他們只是感情好拇涤,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布捣作。 她就那樣靜靜地躺著,像睡著了一般鹅士。 火紅的嫁衣襯著肌膚如雪券躁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天如绸,我揣著相機與錄音,去河邊找鬼旭贬。 笑死怔接,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的稀轨。 我是一名探鬼主播扼脐,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奋刽!你這毒婦竟也來了瓦侮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤佣谐,失蹤者是張志新(化名)和其女友劉穎肚吏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狭魂,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡罚攀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年党觅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斋泄。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡杯瞻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炫掐,到底是詐尸還是另有隱情魁莉,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布募胃,位于F島的核電站旗唁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏摔认。R本人自食惡果不足惜逆皮,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望参袱。 院中可真熱鬧电谣,春花似錦、人聲如沸抹蚀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽环壤。三九已至晒来,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間郑现,已是汗流浹背湃崩。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留接箫,地道東北人攒读。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像辛友,于是被迫代替她去往敵國和親薄扁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

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