Skip to content

Commit 6182124

Browse files
authored
feat: update solutions to lc problem: No.0873
No.0873.Length of Longest Fibonacci Subsequence
1 parent 34f4257 commit 6182124

File tree

10 files changed

+157
-72
lines changed

10 files changed

+157
-72
lines changed

solution/0000-0099/0007.Reverse Integer/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,21 +164,21 @@ func reverse(x int) int {
164164
slot := make([]int, 11)
165165
count := 0
166166
for x != 0 {
167-
n := x%10
167+
n := x % 10
168168
slot[count] = n
169169
count++
170170
x /= 10
171171
}
172172
result := 0
173173
flag := true
174-
for i := 0; i < count; i++ {
174+
for i := 0; i < count; i++ {
175175
if flag && slot[i] == 0 {
176176
continue
177177
}
178178
flag = false
179-
result = 10 * result + slot[i]
179+
result = 10*result + slot[i]
180180
}
181-
if result > math.MaxInt32 || result < math.MinInt32 {
181+
if result > math.MaxInt32 || result < math.MinInt32 {
182182
return 0
183183
}
184184
return result
@@ -187,7 +187,7 @@ func reverse(x int) int {
187187

188188
### **C#**
189189

190-
```rb
190+
```cs
191191
public class Solution {
192192
public int Reverse(int x) {
193193
var negative = x < 0;

solution/0000-0099/0007.Reverse Integer/README_EN.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,21 +143,21 @@ func reverse(x int) int {
143143
slot := make([]int, 11)
144144
count := 0
145145
for x != 0 {
146-
n := x%10
146+
n := x % 10
147147
slot[count] = n
148148
count++
149149
x /= 10
150150
}
151151
result := 0
152152
flag := true
153-
for i := 0; i < count; i++ {
153+
for i := 0; i < count; i++ {
154154
if flag && slot[i] == 0 {
155155
continue
156156
}
157157
flag = false
158-
result = 10 * result + slot[i]
158+
result = 10*result + slot[i]
159159
}
160-
if result > math.MaxInt32 || result < math.MinInt32 {
160+
if result > math.MaxInt32 || result < math.MinInt32 {
161161
return 0
162162
}
163163
return result
@@ -166,7 +166,7 @@ func reverse(x int) int {
166166

167167
### **C#**
168168

169-
```rb
169+
```cs
170170
public class Solution {
171171
public int Reverse(int x) {
172172
var negative = x < 0;

solution/0000-0099/0007.Reverse Integer/Solution.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,21 @@ func reverse(x int) int {
22
slot := make([]int, 11)
33
count := 0
44
for x != 0 {
5-
n := x%10
5+
n := x % 10
66
slot[count] = n
77
count++
88
x /= 10
99
}
1010
result := 0
1111
flag := true
12-
for i := 0; i < count; i++ {
12+
for i := 0; i < count; i++ {
1313
if flag && slot[i] == 0 {
1414
continue
1515
}
1616
flag = false
17-
result = 10 * result + slot[i]
17+
result = 10*result + slot[i]
1818
}
19-
if result > math.MaxInt32 || result < math.MinInt32 {
19+
if result > math.MaxInt32 || result < math.MinInt32 {
2020
return 0
2121
}
2222
return result

solution/0800-0899/0873.Length of Longest Fibonacci Subsequence/README.md

Lines changed: 50 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353

5454
<!-- 这里可写通用的实现逻辑 -->
5555

56-
动态规划
56+
**方法一:动态规划**
5757

5858
- 状态表示:`dp[j][i]` 表示斐波那契式最后两项为 `arr[j]`, `arr[i]` 时的最大子序列长度。
5959
- 状态计算:`dp[j][i] = dp[k][j] + 1`(当且仅当 `k < j < i`,并且 `arr[k] + arr[j] == arr[i]`), `ans = max(ans, dp[j][i])`
@@ -76,12 +76,10 @@ class Solution:
7676
ans = 0
7777
for i in range(n):
7878
for j in range(i):
79-
delta = arr[i] - arr[j]
80-
if delta in mp:
81-
k = mp[delta]
82-
if k < j:
83-
dp[j][i] = dp[k][j] + 1
84-
ans = max(ans, dp[j][i])
79+
d = arr[i] - arr[j]
80+
if d in mp and (k := mp[d]) < j:
81+
dp[j][i] = max(dp[j][i], dp[k][j] + 1)
82+
ans = max(ans, dp[j][i])
8583
return ans
8684
```
8785

@@ -106,11 +104,11 @@ class Solution {
106104
int ans = 0;
107105
for (int i = 0; i < n; ++i) {
108106
for (int j = 0; j < i; ++j) {
109-
int delta = arr[i] - arr[j];
110-
if (mp.containsKey(delta)) {
111-
int k = mp.get(delta);
107+
int d = arr[i] - arr[j];
108+
if (mp.containsKey(d)) {
109+
int k = mp.get(d);
112110
if (k < j) {
113-
dp[j][i] = dp[k][j] + 1;
111+
dp[j][i] = Math.max(dp[j][i], dp[k][j] + 1);
114112
ans = Math.max(ans, dp[j][i]);
115113
}
116114
}
@@ -132,22 +130,20 @@ public:
132130
for (int i = 0; i < n; ++i) mp[arr[i]] = i;
133131
vector<vector<int>> dp(n, vector<int>(n));
134132
for (int i = 0; i < n; ++i)
135-
{
136133
for (int j = 0; j < i; ++j)
137134
dp[j][i] = 2;
138-
}
139135
int ans = 0;
140136
for (int i = 0; i < n; ++i)
141137
{
142138
for (int j = 0; j < i; ++j)
143139
{
144-
int delta = arr[i] - arr[j];
145-
if (mp.count(delta))
140+
int d = arr[i] - arr[j];
141+
if (mp.count(d))
146142
{
147-
int k = mp[delta];
143+
int k = mp[d];
148144
if (k < j)
149145
{
150-
dp[j][i] = dp[k][j] + 1;
146+
dp[j][i] = max(dp[j][i], dp[k][j] + 1);
151147
ans = max(ans, dp[j][i]);
152148
}
153149
}
@@ -177,10 +173,10 @@ func lenLongestFibSubseq(arr []int) int {
177173
ans := 0
178174
for i := 0; i < n; i++ {
179175
for j := 0; j < i; j++ {
180-
delta := arr[i] - arr[j]
181-
k := mp[delta] - 1
176+
d := arr[i] - arr[j]
177+
k := mp[d] - 1
182178
if k >= 0 && k < j {
183-
dp[j][i] = dp[k][j] + 1
179+
dp[j][i] = max(dp[j][i], dp[k][j]+1)
184180
ans = max(ans, dp[j][i])
185181
}
186182
}
@@ -196,6 +192,40 @@ func max(a, b int) int {
196192
}
197193
```
198194

195+
### **JavaScript**
196+
197+
```js
198+
/**
199+
* @param {number[]} arr
200+
* @return {number}
201+
*/
202+
var lenLongestFibSubseq = function (arr) {
203+
const mp = new Map();
204+
const n = arr.length;
205+
const dp = new Array(n).fill(0).map(() => new Array(n).fill(0));
206+
for (let i = 0; i < n; ++i) {
207+
mp.set(arr[i], i);
208+
for (let j = 0; j < i; ++j) {
209+
dp[j][i] = 2;
210+
}
211+
}
212+
let ans = 0;
213+
for (let i = 0; i < n; ++i) {
214+
for (let j = 0; j < i; ++j) {
215+
const d = arr[i] - arr[j];
216+
if (mp.has(d)) {
217+
const k = mp.get(d);
218+
if (k < j) {
219+
dp[j][i] = Math.max(dp[j][i], dp[k][j] + 1);
220+
ans = Math.max(ans, dp[j][i]);
221+
}
222+
}
223+
}
224+
}
225+
return ans;
226+
};
227+
```
228+
199229
### **...**
200230

201231
```

solution/0800-0899/0873.Length of Longest Fibonacci Subsequence/README_EN.md

Lines changed: 49 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,10 @@ class Solution:
5858
ans = 0
5959
for i in range(n):
6060
for j in range(i):
61-
delta = arr[i] - arr[j]
62-
if delta in mp:
63-
k = mp[delta]
64-
if k < j:
65-
dp[j][i] = dp[k][j] + 1
66-
ans = max(ans, dp[j][i])
61+
d = arr[i] - arr[j]
62+
if d in mp and (k := mp[d]) < j:
63+
dp[j][i] = max(dp[j][i], dp[k][j] + 1)
64+
ans = max(ans, dp[j][i])
6765
return ans
6866
```
6967

@@ -86,11 +84,11 @@ class Solution {
8684
int ans = 0;
8785
for (int i = 0; i < n; ++i) {
8886
for (int j = 0; j < i; ++j) {
89-
int delta = arr[i] - arr[j];
90-
if (mp.containsKey(delta)) {
91-
int k = mp.get(delta);
87+
int d = arr[i] - arr[j];
88+
if (mp.containsKey(d)) {
89+
int k = mp.get(d);
9290
if (k < j) {
93-
dp[j][i] = dp[k][j] + 1;
91+
dp[j][i] = Math.max(dp[j][i], dp[k][j] + 1);
9492
ans = Math.max(ans, dp[j][i]);
9593
}
9694
}
@@ -112,22 +110,20 @@ public:
112110
for (int i = 0; i < n; ++i) mp[arr[i]] = i;
113111
vector<vector<int>> dp(n, vector<int>(n));
114112
for (int i = 0; i < n; ++i)
115-
{
116113
for (int j = 0; j < i; ++j)
117114
dp[j][i] = 2;
118-
}
119115
int ans = 0;
120116
for (int i = 0; i < n; ++i)
121117
{
122118
for (int j = 0; j < i; ++j)
123119
{
124-
int delta = arr[i] - arr[j];
125-
if (mp.count(delta))
120+
int d = arr[i] - arr[j];
121+
if (mp.count(d))
126122
{
127-
int k = mp[delta];
123+
int k = mp[d];
128124
if (k < j)
129125
{
130-
dp[j][i] = dp[k][j] + 1;
126+
dp[j][i] = max(dp[j][i], dp[k][j] + 1);
131127
ans = max(ans, dp[j][i]);
132128
}
133129
}
@@ -157,10 +153,10 @@ func lenLongestFibSubseq(arr []int) int {
157153
ans := 0
158154
for i := 0; i < n; i++ {
159155
for j := 0; j < i; j++ {
160-
delta := arr[i] - arr[j]
161-
k := mp[delta] - 1
156+
d := arr[i] - arr[j]
157+
k := mp[d] - 1
162158
if k >= 0 && k < j {
163-
dp[j][i] = dp[k][j] + 1
159+
dp[j][i] = max(dp[j][i], dp[k][j]+1)
164160
ans = max(ans, dp[j][i])
165161
}
166162
}
@@ -176,6 +172,40 @@ func max(a, b int) int {
176172
}
177173
```
178174

175+
### **JavaScript**
176+
177+
```js
178+
/**
179+
* @param {number[]} arr
180+
* @return {number}
181+
*/
182+
var lenLongestFibSubseq = function (arr) {
183+
const mp = new Map();
184+
const n = arr.length;
185+
const dp = new Array(n).fill(0).map(() => new Array(n).fill(0));
186+
for (let i = 0; i < n; ++i) {
187+
mp.set(arr[i], i);
188+
for (let j = 0; j < i; ++j) {
189+
dp[j][i] = 2;
190+
}
191+
}
192+
let ans = 0;
193+
for (let i = 0; i < n; ++i) {
194+
for (let j = 0; j < i; ++j) {
195+
const d = arr[i] - arr[j];
196+
if (mp.has(d)) {
197+
const k = mp.get(d);
198+
if (k < j) {
199+
dp[j][i] = Math.max(dp[j][i], dp[k][j] + 1);
200+
ans = Math.max(ans, dp[j][i]);
201+
}
202+
}
203+
}
204+
}
205+
return ans;
206+
};
207+
```
208+
179209
### **...**
180210

181211
```

solution/0800-0899/0873.Length of Longest Fibonacci Subsequence/Solution.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,20 @@ class Solution {
66
for (int i = 0; i < n; ++i) mp[arr[i]] = i;
77
vector<vector<int>> dp(n, vector<int>(n));
88
for (int i = 0; i < n; ++i)
9-
{
109
for (int j = 0; j < i; ++j)
1110
dp[j][i] = 2;
12-
}
1311
int ans = 0;
1412
for (int i = 0; i < n; ++i)
1513
{
1614
for (int j = 0; j < i; ++j)
1715
{
18-
int delta = arr[i] - arr[j];
19-
if (mp.count(delta))
16+
int d = arr[i] - arr[j];
17+
if (mp.count(d))
2018
{
21-
int k = mp[delta];
19+
int k = mp[d];
2220
if (k < j)
2321
{
24-
dp[j][i] = dp[k][j] + 1;
22+
dp[j][i] = max(dp[j][i], dp[k][j] + 1);
2523
ans = max(ans, dp[j][i]);
2624
}
2725
}

solution/0800-0899/0873.Length of Longest Fibonacci Subsequence/Solution.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ func lenLongestFibSubseq(arr []int) int {
1414
ans := 0
1515
for i := 0; i < n; i++ {
1616
for j := 0; j < i; j++ {
17-
delta := arr[i] - arr[j]
18-
k := mp[delta] - 1
17+
d := arr[i] - arr[j]
18+
k := mp[d] - 1
1919
if k >= 0 && k < j {
20-
dp[j][i] = dp[k][j] + 1
20+
dp[j][i] = max(dp[j][i], dp[k][j]+1)
2121
ans = max(ans, dp[j][i])
2222
}
2323
}

solution/0800-0899/0873.Length of Longest Fibonacci Subsequence/Solution.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ public int lenLongestFibSubseq(int[] arr) {
1414
int ans = 0;
1515
for (int i = 0; i < n; ++i) {
1616
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);
17+
int d = arr[i] - arr[j];
18+
if (mp.containsKey(d)) {
19+
int k = mp.get(d);
2020
if (k < j) {
21-
dp[j][i] = dp[k][j] + 1;
21+
dp[j][i] = Math.max(dp[j][i], dp[k][j] + 1);
2222
ans = Math.max(ans, dp[j][i]);
2323
}
2424
}

0 commit comments

Comments
 (0)