Skip to content

Commit fbc7830

Browse files
committed
Add C++ solutions for leetcode 1218.
1 parent 624c6cc commit fbc7830

3 files changed

+129
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#include<vector>
2+
#include<algorithm>
3+
#include<iostream>
4+
#include<unordered_map>
5+
using namespace std;
6+
7+
const int K = 1e5;
8+
class Solution {
9+
public:
10+
int longestSubsequence(vector<int>& arr, int diff) {
11+
const int N = arr.size();
12+
int count = 0;
13+
for (auto& num : arr)
14+
{
15+
if (num == arr.front()) count++;
16+
}
17+
if (diff == 0 && count == N) return N;
18+
19+
int res = 1;
20+
int dp[2*K+1];
21+
memset(dp, 0, sizeof(dp));
22+
for (auto& num : arr)
23+
{
24+
dp[num + K] = 1;
25+
if (dp[num - diff + K] != 0)
26+
dp[num + K] = dp[num - diff + K] + 1;
27+
}
28+
for (auto& num : dp)
29+
res = max(res, num);
30+
31+
return res;
32+
}
33+
};
34+
35+
// Test
36+
int main()
37+
{
38+
Solution sol;
39+
vector<int> arr = {1, 5, 7, 8, 5, 3, 4, 2, 1};
40+
int diff = -2;
41+
auto res = sol.longestSubsequence(arr, diff);
42+
cout << res << endl;
43+
44+
return 0;
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#include<vector>
2+
#include<algorithm>
3+
#include<iostream>
4+
#include<cstring> /* std::memset在这个头文件中 */
5+
#include<numeric>
6+
using namespace std;
7+
8+
const int K = 1e5;
9+
class Solution {
10+
public:
11+
int longestSubsequence(vector<int>& arr, int diff) {
12+
const int N = arr.size();
13+
long sum = accumulate(arr.begin(), arr.end(), (long)0);
14+
if (diff == 0 && sum == N*arr[0]) return N;
15+
int res = 1;
16+
int dp[2*K+1];
17+
memset(dp, 0, sizeof(dp));
18+
for (auto& num : arr)
19+
{
20+
dp[num + K] = 1;
21+
if (dp[num - diff + K] != 0)
22+
dp[num + K] = dp[num - diff + K] + 1;
23+
}
24+
for (auto& num : dp)
25+
res = max(res, num);
26+
27+
return res;
28+
}
29+
};
30+
31+
// Test
32+
int main()
33+
{
34+
Solution sol;
35+
vector<int> arr = {1, 5, 7, 8, 5, 3, 4, 2, 1};
36+
int diff = -2;
37+
auto res = sol.longestSubsequence(arr, diff);
38+
cout << res << endl;
39+
40+
return 0;
41+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include<vector>
2+
#include<algorithm>
3+
#include<iostream>
4+
#include<unordered_map>
5+
using namespace std;
6+
7+
class Solution {
8+
public:
9+
int longestSubsequence(vector<int>& arr, int diff) {
10+
const int N = arr.size();
11+
int count = 0;
12+
for (auto& num : arr)
13+
{
14+
if (num == arr.front()) count++;
15+
}
16+
if (diff == 0 && count == N) return N;
17+
18+
int res = 1; // 记录最大长度
19+
unordered_map<int, int> dp; /* map: value -> length, dp[i]: 以nums[i]结尾的最长等差子序列的长度, 类似于LIS的dp数组定义 */
20+
for (auto& num : arr)
21+
{
22+
dp[num] = 1; /* 不能构成等差序列的情形, 最长的等差子序列的长度为1, 默认值可设置为 1 */
23+
if (dp.count(num - diff)) /* 如果num - diff 出现过, (num-diff)与num组成等差序列, 最大等差子序列的长度+1, 扩展出1个新的等差数列 */
24+
dp[num] = dp[num - diff] + 1;
25+
}
26+
for (auto& kvp : dp)
27+
res = max(res, kvp.second);
28+
29+
return res;
30+
}
31+
};
32+
33+
// Test
34+
int main()
35+
{
36+
Solution sol;
37+
vector<int> arr = {1, 5, 7, 8, 5, 3, 4, 2, 1};
38+
int diff = -2;
39+
auto res = sol.longestSubsequence(arr, diff);
40+
cout << res << endl;
41+
42+
return 0;
43+
}

0 commit comments

Comments
 (0)