Skip to content

Commit ccda80c

Browse files
author
rom.spiridonov
committed
feat: optimize longest subsequence solution in C++
1 parent e63dc7c commit ccda80c

File tree

1 file changed

+22
-16
lines changed
  • solution/3400-3499/3409.Longest Subsequence With Decreasing Adjacent Difference

1 file changed

+22
-16
lines changed

solution/3400-3499/3409.Longest Subsequence With Decreasing Adjacent Difference/Solution.cpp

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
1+
#include <vector>
2+
#include <algorithm>
3+
#include <ranges>
4+
using namespace std;
5+
using namespace std::ranges;
6+
17
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));
8+
public:
9+
int longestSubsequence(vector<int>& nums) {
10+
const int mx = max(nums);
11+
vector<vector<int>> dp(mx + 1, vector<int>(mx + 1));
12+
13+
for (const int num : nums) {
14+
for (int prev = 1; prev <= mx; ++prev) {
15+
const int diff = abs(num - prev);
16+
dp[num][diff] = max(dp[num][diff], dp[prev][diff] + 1);
17+
}
18+
for (int j = mx - 1; j >= 0; --j)
19+
dp[num][j] = max(dp[num][j], dp[num][j + 1]);
20+
}
621

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]);
22+
return max_element(dp, less{}, [](const vector<int>& row) {
23+
return row[0];
24+
})->at(0);
1425
}
1526

16-
return ranges::max_element(dp, ranges::less{}, [](const vector<int>& row) {
17-
return row[0];
18-
})->at(0);
19-
}
20-
};

0 commit comments

Comments
 (0)