今天總結一下leetcode上的兩道看可以用同一解法實則不可生搬硬套的兩道相似題。
1、873. 最長的斐波那契子串行的長度 - 力扣(leetcode) (leetcode-cn.com)
本題的難點在於狀態定義:與一般的dp題不同,這裡我們選擇將dp陣列定義為:dp[i][j]表示以arr[i],arr[j]結尾的斐波那契數列的最大長度。因為想要確定乙個斐波那契數列需要三個值arr[i],arr[j],arr[k],如果直接定義首先會出現乙個三重迴圈,並且許多細節難以言表。。。將狀態轉移陣列定義成上述表示可以根據性質:arr[k]+arr[i]=arr[j]來確定k的值,減小迴圈數。為了獲取下標需要乙個hash表來將各個元素的下標提取出來(由於陣列嚴格遞增,所以我們不用擔心重複問題)。k由index[arr[i]-arr[j]]唯一確定。
class solution
};
時間複雜度:o(n2)
2、1027. 最長等差數列 - 力扣(leetcode) (leetcode-cn.com)
這道題與上一道題十分相似,像我這樣的新手很容易慣性思維直接套用上題的解法。但其實在這裡是有問題的。因為題目中給定的陣列nums並沒有說明是嚴格遞增的,這意味著陣列中可能會出現重複元素,從而在確定第三維的下標時產生重複。因此在這裡我們將狀態定義為:dp[i][j]表示以nums[i]結尾的公差為j的等差數列的最大長度。根據題目所給的資料範圍:0<=nums[i]<=500我們可以確定公差的範圍-500<=d<=500,因此我們將公差加上500使之恆正,便於我們定義dp陣列。根據nums[i]-nums[j]+500來唯一確定公差。其他的便與lis演算法相似。
class solution
}return res+1;}};
動態規劃 斐波那契數列
問 大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0 n 39 斐波那契數列簡單介紹 我的解法 注 從fibonacci n 1 fibonacci n 2 明顯看出使用的是遞迴,此題用遞迴兩三行 即可搞定。但是,若出題者準備著乙個超大的n,那麼很有...
遞迴和動態規劃 斐波那契數列
程式設計師 面試指南 chapter 4 感受 mulmatrix函式和matrixpower函式寫法要注意細節,需要牢記加速矩陣乘法的演算法思路將時間複雜度降低!暴力遞迴,o 2 n intf1 int n return res 利用矩陣,o log n 牛客上 給出乙個整數 n,請輸出斐波那契數...
python斐波那契數列動態規劃
斐波那契類似於1 1 2 3 5 8這樣的數列,當前項等於前兩項之和。根據這個規律就可以用遞迴來做,可是當數字很大的時候,遞迴耗時很長,因此可以採用動態規劃來做。動態規劃 deffeibonacci1 n array 0 1 while len array n 1 array 2 return ar...