Skip to content

Commit 3c71787

Browse files
author
rom.spiridonov
committed
feat: add solutions for longest subsequence problem in Python, C++, Go, and Rust
1 parent bfd23a2 commit 3c71787

File tree

6 files changed

+343
-6
lines changed

6 files changed

+343
-6
lines changed

solution/3400-3499/3409.Longest Subsequence With Decreasing Adjacent Difference/README.md

Lines changed: 114 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,28 @@ tags:
8282

8383
<!-- tabs:start -->
8484

85-
#### Python3
86-
8785
```python
88-
86+
class Solution:
87+
def longestSubsequence(self, nums: List[int]) -> int:
88+
mx = max(nums)
89+
mn = min(nums)
90+
91+
diff = mx - mn
92+
dp = [[0] * (diff + 1) for _ in range(mx + 1)]
93+
ans = 0
94+
95+
for n in nums:
96+
maxnum = 1
97+
for i in range(diff, -1, -1):
98+
if n + i <= mx and dp[n + i][i] + 1 > maxnum:
99+
maxnum = dp[n + i][i] + 1
100+
if n - i >= 0 and dp[n - i][i] + 1 > maxnum:
101+
maxnum = dp[n - i][i] + 1
102+
103+
dp[n][i] = maxnum
104+
ans = max(maxnum,ans)
105+
106+
return ans
89107
```
90108

91109
#### Java
@@ -97,13 +115,105 @@ tags:
97115
#### C++
98116

99117
```cpp
100-
118+
class Solution {
119+
public:
120+
int longestSubsequence(vector<int>& nums) {
121+
const int mx = ranges::max(nums);
122+
vector<vector<int>> dp(mx + 1, vector<int>(mx + 1));
123+
124+
for (const int num : nums) {
125+
for (int prev = 1; prev <= mx; ++prev) {
126+
const int diff = abs(num - prev);
127+
dp[num][diff] = max(dp[num][diff], dp[prev][diff] + 1);
128+
}
129+
for (int j = mx - 1; j >= 0; --j)
130+
dp[num][j] = max(dp[num][j], dp[num][j + 1]);
131+
}
132+
133+
return ranges::max_element(dp, ranges::less{}, [](const vector<int>& row) {
134+
return row[0];
135+
})->at(0);
136+
}
137+
};
101138
```
102139

103140
#### Go
104141

105142
```go
143+
func longestSubsequence(nums []int) int {
144+
mx, mn := nums[0], nums[0]
145+
for _, v := range nums {
146+
if v > mx {
147+
mx = v
148+
}
149+
if v < mn {
150+
mn = v
151+
}
152+
}
153+
diff := mx - mn
154+
dp := make([][]int, mx+1)
155+
for i := range dp {
156+
dp[i] = make([]int, diff+1)
157+
}
158+
159+
ans := 0
160+
161+
for _, n := range nums {
162+
maxnum := 1
163+
for d := diff; d >= 0; d-- {
164+
if n+d <= mx && dp[n+d][d]+1 > maxnum {
165+
maxnum = dp[n+d][d] + 1
166+
}
167+
if n-d >= 0 && dp[n-d][d]+1 > maxnum {
168+
maxnum = dp[n-d][d] + 1
169+
}
170+
dp[n][d] = maxnum
171+
if maxnum > ans {
172+
ans = maxnum
173+
}
174+
}
175+
}
176+
177+
return ans
178+
}
179+
```
106180

181+
#### Rust
182+
183+
```rust
184+
impl Solution {
185+
pub fn longest_subsequence(nums: Vec<i32>) -> i32 {
186+
let mx = *nums.iter().max().unwrap();
187+
let mn = *nums.iter().min().unwrap();
188+
let diff = (mx - mn) as usize;
189+
190+
let mut dp = vec![vec![0; diff + 1]; (mx + 1) as usize];
191+
192+
let mut ans = 0;
193+
194+
for &n in nums.iter() {
195+
let n_usize = n as usize;
196+
let mut maxnum = 1;
197+
198+
for d in (0..=diff).rev() {
199+
if n_usize + d <= mx as usize {
200+
if dp[n_usize + d][d] + 1 > maxnum {
201+
maxnum = dp[n_usize + d][d] + 1;
202+
}
203+
}
204+
if n_usize >= d {
205+
if dp[n_usize - d][d] + 1 > maxnum {
206+
maxnum = dp[n_usize - d][d] + 1;
207+
}
208+
}
209+
dp[n_usize][d] = maxnum;
210+
ans = ans.max(maxnum);
211+
}
212+
}
213+
214+
ans
215+
}
216+
}
107217
```
108218

109219
<!-- tabs:end -->

solution/3400-3499/3409.Longest Subsequence With Decreasing Adjacent Difference/README_EN.md

Lines changed: 116 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,27 @@ tags:
8383
#### Python3
8484

8585
```python
86-
86+
class Solution:
87+
def longestSubsequence(self, nums: List[int]) -> int:
88+
mx = max(nums)
89+
mn = min(nums)
90+
91+
diff = mx - mn
92+
dp = [[0] * (diff + 1) for _ in range(mx + 1)]
93+
ans = 0
94+
95+
for n in nums:
96+
maxnum = 1
97+
for i in range(diff, -1, -1):
98+
if n + i <= mx and dp[n + i][i] + 1 > maxnum:
99+
maxnum = dp[n + i][i] + 1
100+
if n - i >= 0 and dp[n - i][i] + 1 > maxnum:
101+
maxnum = dp[n - i][i] + 1
102+
103+
dp[n][i] = maxnum
104+
ans = max(maxnum,ans)
105+
106+
return ans
87107
```
88108

89109
#### Java
@@ -95,12 +115,106 @@ tags:
95115
#### C++
96116

97117
```cpp
98-
118+
class Solution {
119+
public:
120+
int longestSubsequence(vector<int>& nums) {
121+
const int mx = ranges::max(nums);
122+
vector<vector<int>> dp(mx + 1, vector<int>(mx + 1));
123+
124+
for (const int num : nums) {
125+
for (int prev = 1; prev <= mx; ++prev) {
126+
const int diff = abs(num - prev);
127+
dp[num][diff] = max(dp[num][diff], dp[prev][diff] + 1);
128+
}
129+
for (int j = mx - 1; j >= 0; --j)
130+
dp[num][j] = max(dp[num][j], dp[num][j + 1]);
131+
}
132+
133+
return ranges::max_element(dp, ranges::less{}, [](const vector<int>& row) {
134+
return row[0];
135+
})->at(0);
136+
}
137+
};
99138
```
100139

101140
#### Go
102141

103142
```go
143+
func longestSubsequence(nums []int) int {
144+
mx, mn := nums[0], nums[0]
145+
for _, v := range nums {
146+
if v > mx {
147+
mx = v
148+
}
149+
if v < mn {
150+
mn = v
151+
}
152+
}
153+
diff := mx - mn
154+
dp := make([][]int, mx+1)
155+
for i := range dp {
156+
dp[i] = make([]int, diff+1)
157+
}
158+
159+
ans := 0
160+
161+
for _, n := range nums {
162+
maxnum := 1
163+
for d := diff; d >= 0; d-- {
164+
if n+d <= mx && dp[n+d][d]+1 > maxnum {
165+
maxnum = dp[n+d][d] + 1
166+
}
167+
if n-d >= 0 && dp[n-d][d]+1 > maxnum {
168+
maxnum = dp[n-d][d] + 1
169+
}
170+
dp[n][d] = maxnum
171+
if maxnum > ans {
172+
ans = maxnum
173+
}
174+
}
175+
}
176+
177+
return ans
178+
}
179+
```
180+
181+
#### Rust
182+
183+
```rust
184+
impl Solution {
185+
pub fn longest_subsequence(nums: Vec<i32>) -> i32 {
186+
let mx = *nums.iter().max().unwrap();
187+
let mn = *nums.iter().min().unwrap();
188+
let diff = (mx - mn) as usize;
189+
190+
let mut dp = vec![vec![0; diff + 1]; (mx + 1) as usize];
191+
192+
let mut ans = 0;
193+
194+
for &n in nums.iter() {
195+
let n_usize = n as usize;
196+
let mut maxnum = 1;
197+
198+
for d in (0..=diff).rev() {
199+
if n_usize + d <= mx as usize {
200+
if dp[n_usize + d][d] + 1 > maxnum {
201+
maxnum = dp[n_usize + d][d] + 1;
202+
}
203+
}
204+
if n_usize >= d {
205+
if dp[n_usize - d][d] + 1 > maxnum {
206+
maxnum = dp[n_usize - d][d] + 1;
207+
}
208+
}
209+
dp[n_usize][d] = maxnum;
210+
ans = ans.max(maxnum);
211+
}
212+
}
213+
214+
ans
215+
}
216+
}
217+
104218

105219
```
106220

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
int longestSubsequence(vector<int>& nums) {
4+
const int mx = ranges::max(nums);
5+
vector<vector<int>> dp(mx + 1, vector<int>(mx + 1));
6+
7+
for (const int num : nums) {
8+
for (int prev = 1; prev <= mx; ++prev) {
9+
const int diff = abs(num - prev);
10+
dp[num][diff] = max(dp[num][diff], dp[prev][diff] + 1);
11+
}
12+
for (int j = mx - 1; j >= 0; --j)
13+
dp[num][j] = max(dp[num][j], dp[num][j + 1]);
14+
}
15+
16+
return ranges::max_element(dp, ranges::less{}, [](const vector<int>& row) {
17+
return row[0];
18+
})->at(0);
19+
}
20+
};
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
func longestSubsequence(nums []int) int {
2+
mx, mn := nums[0], nums[0]
3+
for _, v := range nums {
4+
if v > mx {
5+
mx = v
6+
}
7+
if v < mn {
8+
mn = v
9+
}
10+
}
11+
diff := mx - mn
12+
dp := make([][]int, mx+1)
13+
for i := range dp {
14+
dp[i] = make([]int, diff+1)
15+
}
16+
17+
ans := 0
18+
19+
for _, n := range nums {
20+
maxnum := 1
21+
for d := diff; d >= 0; d-- {
22+
if n+d <= mx && dp[n+d][d]+1 > maxnum {
23+
maxnum = dp[n+d][d] + 1
24+
}
25+
if n-d >= 0 && dp[n-d][d]+1 > maxnum {
26+
maxnum = dp[n-d][d] + 1
27+
}
28+
dp[n][d] = maxnum
29+
if maxnum > ans {
30+
ans = maxnum
31+
}
32+
}
33+
}
34+
35+
return ans
36+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from typing import List
2+
3+
4+
class Solution:
5+
def longestSubsequence(self, nums: List[int]) -> int:
6+
mx = max(nums)
7+
mn = min(nums)
8+
9+
diff = mx - mn
10+
dp = [[0] * (diff + 1) for _ in range(mx + 1)]
11+
ans = 0
12+
13+
for n in nums:
14+
maxnum = 1
15+
for i in range(diff, -1, -1):
16+
if n + i <= mx and dp[n + i][i] + 1 > maxnum:
17+
maxnum = dp[n + i][i] + 1
18+
if n - i >= 0 and dp[n - i][i] + 1 > maxnum:
19+
maxnum = dp[n - i][i] + 1
20+
21+
dp[n][i] = maxnum
22+
ans = max(maxnum, ans)
23+
24+
return ans
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
impl Solution {
2+
pub fn longest_subsequence(nums: Vec<i32>) -> i32 {
3+
let mx = *nums.iter().max().unwrap();
4+
let mn = *nums.iter().min().unwrap();
5+
let diff = (mx - mn) as usize;
6+
7+
let mut dp = vec![vec![0; diff + 1]; (mx + 1) as usize];
8+
9+
let mut ans = 0;
10+
11+
for &n in nums.iter() {
12+
let n_usize = n as usize;
13+
let mut maxnum = 1;
14+
15+
for d in (0..=diff).rev() {
16+
if n_usize + d <= mx as usize {
17+
if dp[n_usize + d][d] + 1 > maxnum {
18+
maxnum = dp[n_usize + d][d] + 1;
19+
}
20+
}
21+
if n_usize >= d {
22+
if dp[n_usize - d][d] + 1 > maxnum {
23+
maxnum = dp[n_usize - d][d] + 1;
24+
}
25+
}
26+
dp[n_usize][d] = maxnum;
27+
ans = ans.max(maxnum);
28+
}
29+
}
30+
31+
ans
32+
}
33+
}

0 commit comments

Comments
 (0)