Skip to content

Commit bd3de43

Browse files
committed
feat: add solutions to lc/lcof2 problem: Length of Longest Fibonacci Subsequence
1 parent 3b0951e commit bd3de43

File tree

11 files changed

+599
-6
lines changed

11 files changed

+599
-6
lines changed

lcof2/剑指 Offer II 093. 最长斐波那契数列/README.md

+126-2
Original file line numberDiff line numberDiff line change
@@ -51,27 +51,151 @@
5151

5252
<p><meta charset="UTF-8" />注意:本题与主站 873&nbsp;题相同:&nbsp;<a href="https://leetcode-cn.com/problems/length-of-longest-fibonacci-subsequence/">https://leetcode-cn.com/problems/length-of-longest-fibonacci-subsequence/</a></p>
5353

54-
5554
## 解法
5655

5756
<!-- 这里可写通用的实现逻辑 -->
5857

58+
动态规划。
59+
60+
- 状态表示:`dp[j][i]` 表示斐波那契式最后两项为 `arr[j]`, `arr[i]` 时的最大子序列长度。
61+
- 状态计算:`dp[j][i] = dp[k][j] + 1`(当且仅当 `k < j < i`,并且 `arr[k] + arr[j] == arr[i]`), `ans = max(ans, dp[j][i])`
62+
5963
<!-- tabs:start -->
6064

6165
### **Python3**
6266

6367
<!-- 这里可写当前语言的特殊实现逻辑 -->
6468

6569
```python
66-
70+
class Solution:
71+
def lenLongestFibSubseq(self, arr: List[int]) -> int:
72+
mp = {v: i for i, v in enumerate(arr)}
73+
n = len(arr)
74+
dp = [[0] * n for _ in range(n)]
75+
for i in range(n):
76+
for j in range(i):
77+
dp[j][i] = 2
78+
ans = 0
79+
for i in range(n):
80+
for j in range(i):
81+
delta = arr[i] - arr[j]
82+
if delta in mp:
83+
k = mp[delta]
84+
if k < j:
85+
dp[j][i] = dp[k][j] + 1
86+
ans = max(ans, dp[j][i])
87+
return ans
6788
```
6889

6990
### **Java**
7091

7192
<!-- 这里可写当前语言的特殊实现逻辑 -->
7293

7394
```java
95+
class Solution {
96+
public int lenLongestFibSubseq(int[] arr) {
97+
int n = arr.length;
98+
Map<Integer, Integer> mp = new HashMap<>();
99+
for (int i = 0; i < n; ++i) {
100+
mp.put(arr[i], i);
101+
}
102+
int[][] dp = new int[n][n];
103+
for (int i = 0; i < n; ++i) {
104+
for (int j = 0; j < i; ++j) {
105+
dp[j][i] = 2;
106+
}
107+
}
108+
int ans = 0;
109+
for (int i = 0; i < n; ++i) {
110+
for (int j = 0; j < i; ++j) {
111+
int delta = arr[i] - arr[j];
112+
if (mp.containsKey(delta)) {
113+
int k = mp.get(delta);
114+
if (k < j) {
115+
dp[j][i] = dp[k][j] + 1;
116+
ans = Math.max(ans, dp[j][i]);
117+
}
118+
}
119+
}
120+
}
121+
return ans;
122+
}
123+
}
124+
```
125+
126+
### **C++**
127+
128+
```cpp
129+
class Solution {
130+
public:
131+
int lenLongestFibSubseq(vector<int>& arr) {
132+
unordered_map<int, int> mp;
133+
int n = arr.size();
134+
for (int i = 0; i < n; ++i) mp[arr[i]] = i;
135+
vector<vector<int>> dp(n, vector<int>(n));
136+
for (int i = 0; i < n; ++i)
137+
{
138+
for (int j = 0; j < i; ++j)
139+
dp[j][i] = 2;
140+
}
141+
int ans = 0;
142+
for (int i = 0; i < n; ++i)
143+
{
144+
for (int j = 0; j < i; ++j)
145+
{
146+
int delta = arr[i] - arr[j];
147+
if (mp.count(delta))
148+
{
149+
int k = mp[delta];
150+
if (k < j)
151+
{
152+
dp[j][i] = dp[k][j] + 1;
153+
ans = max(ans, dp[j][i]);
154+
}
155+
}
156+
}
157+
}
158+
return ans;
159+
}
160+
};
161+
```
74162
163+
### **Go**
164+
165+
```go
166+
func lenLongestFibSubseq(arr []int) int {
167+
n := len(arr)
168+
mp := make(map[int]int, n)
169+
for i, v := range arr {
170+
mp[v] = i + 1
171+
}
172+
dp := make([][]int, n)
173+
for i := 0; i < n; i++ {
174+
dp[i] = make([]int, n)
175+
for j := 0; j < i; j++ {
176+
dp[j][i] = 2
177+
}
178+
}
179+
ans := 0
180+
for i := 0; i < n; i++ {
181+
for j := 0; j < i; j++ {
182+
delta := arr[i] - arr[j]
183+
k := mp[delta] - 1
184+
if k >= 0 && k < j {
185+
dp[j][i] = dp[k][j] + 1
186+
ans = max(ans, dp[j][i])
187+
}
188+
}
189+
}
190+
return ans
191+
}
192+
193+
func max(a, b int) int {
194+
if a > b {
195+
return a
196+
}
197+
return b
198+
}
75199
```
76200

77201
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class Solution {
2+
public:
3+
int lenLongestFibSubseq(vector<int>& arr) {
4+
unordered_map<int, int> mp;
5+
int n = arr.size();
6+
for (int i = 0; i < n; ++i) mp[arr[i]] = i;
7+
vector<vector<int>> dp(n, vector<int>(n));
8+
for (int i = 0; i < n; ++i)
9+
{
10+
for (int j = 0; j < i; ++j)
11+
dp[j][i] = 2;
12+
}
13+
int ans = 0;
14+
for (int i = 0; i < n; ++i)
15+
{
16+
for (int j = 0; j < i; ++j)
17+
{
18+
int delta = arr[i] - arr[j];
19+
if (mp.count(delta))
20+
{
21+
int k = mp[delta];
22+
if (k < j)
23+
{
24+
dp[j][i] = dp[k][j] + 1;
25+
ans = max(ans, dp[j][i]);
26+
}
27+
}
28+
}
29+
}
30+
return ans;
31+
}
32+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
func lenLongestFibSubseq(arr []int) int {
2+
n := len(arr)
3+
mp := make(map[int]int, n)
4+
for i, v := range arr {
5+
mp[v] = i + 1
6+
}
7+
dp := make([][]int, n)
8+
for i := 0; i < n; i++ {
9+
dp[i] = make([]int, n)
10+
for j := 0; j < i; j++ {
11+
dp[j][i] = 2
12+
}
13+
}
14+
ans := 0
15+
for i := 0; i < n; i++ {
16+
for j := 0; j < i; j++ {
17+
delta := arr[i] - arr[j]
18+
k := mp[delta] - 1
19+
if k >= 0 && k < j {
20+
dp[j][i] = dp[k][j] + 1
21+
ans = max(ans, dp[j][i])
22+
}
23+
}
24+
}
25+
return ans
26+
}
27+
28+
func max(a, b int) int {
29+
if a > b {
30+
return a
31+
}
32+
return b
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
class Solution {
2+
public int lenLongestFibSubseq(int[] arr) {
3+
int n = arr.length;
4+
Map<Integer, Integer> mp = new HashMap<>();
5+
for (int i = 0; i < n; ++i) {
6+
mp.put(arr[i], i);
7+
}
8+
int[][] dp = new int[n][n];
9+
for (int i = 0; i < n; ++i) {
10+
for (int j = 0; j < i; ++j) {
11+
dp[j][i] = 2;
12+
}
13+
}
14+
int ans = 0;
15+
for (int i = 0; i < n; ++i) {
16+
for (int j = 0; j < i; ++j) {
17+
int delta = arr[i] - arr[j];
18+
if (mp.containsKey(delta)) {
19+
int k = mp.get(delta);
20+
if (k < j) {
21+
dp[j][i] = dp[k][j] + 1;
22+
ans = Math.max(ans, dp[j][i]);
23+
}
24+
}
25+
}
26+
}
27+
return ans;
28+
}
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution:
2+
def lenLongestFibSubseq(self, arr: List[int]) -> int:
3+
mp = {v: i for i, v in enumerate(arr)}
4+
n = len(arr)
5+
dp = [[0] * n for _ in range(n)]
6+
for i in range(n):
7+
for j in range(i):
8+
dp[j][i] = 2
9+
ans = 0
10+
for i in range(n):
11+
for j in range(i):
12+
delta = arr[i] - arr[j]
13+
if delta in mp:
14+
k = mp[delta]
15+
if k < j:
16+
dp[j][i] = dp[k][j] + 1
17+
ans = max(ans, dp[j][i])
18+
return ans

0 commit comments

Comments
 (0)