Description#
Given an integer array arr
and an integer difference
, return the length of the longest subsequence in arr
which is an arithmetic sequence such that the difference between adjacent elements in the subsequence equals difference
.
A subsequence is a sequence that can be derived from arr
by deleting some or no elements without changing the order of the remaining elements.
Example 1:
Input: arr = [1,2,3,4], difference = 1
Output: 4
Explanation: The longest arithmetic subsequence is [1,2,3,4].
Example 2:
Input: arr = [1,3,5,7], difference = 1
Output: 1
Explanation: The longest arithmetic subsequence is any single element.
Example 3:
Input: arr = [1,5,7,8,5,3,4,2,1], difference = -2
Output: 4
Explanation: The longest arithmetic subsequence is [7,5,3,1].
Constraints:
1 <= arr.length <= 105
-104 <= arr[i], difference <= 104
Solutions#
Solution 1#
1
2
3
4
5
6
| class Solution:
def longestSubsequence(self, arr: List[int], difference: int) -> int:
f = defaultdict(int)
for x in arr:
f[x] = f[x - difference] + 1
return max(f.values())
|
1
2
3
4
5
6
7
8
9
10
11
| class Solution {
public int longestSubsequence(int[] arr, int difference) {
Map<Integer, Integer> f = new HashMap<>();
int ans = 0;
for (int x : arr) {
f.put(x, f.getOrDefault(x - difference, 0) + 1);
ans = Math.max(ans, f.get(x));
}
return ans;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
| class Solution {
public:
int longestSubsequence(vector<int>& arr, int difference) {
unordered_map<int, int> f;
int ans = 0;
for (int x : arr) {
f[x] = f[x - difference] + 1;
ans = max(ans, f[x]);
}
return ans;
}
};
|
1
2
3
4
5
6
7
8
| func longestSubsequence(arr []int, difference int) (ans int) {
f := map[int]int{}
for _, x := range arr {
f[x] = f[x-difference] + 1
ans = max(ans, f[x])
}
return
}
|
1
2
3
4
5
6
7
| function longestSubsequence(arr: number[], difference: number): number {
const f: Map<number, number> = new Map();
for (const x of arr) {
f.set(x, (f.get(x - difference) ?? 0) + 1);
}
return Math.max(...f.values());
}
|
1
2
3
4
5
6
7
8
9
10
11
12
| /**
* @param {number[]} arr
* @param {number} difference
* @return {number}
*/
var longestSubsequence = function (arr, difference) {
const f = new Map();
for (const x of arr) {
f.set(x, (f.get(x - difference) || 0) + 1);
}
return Math.max(...f.values());
};
|