-
-
Notifications
You must be signed in to change notification settings - Fork 46.6k
/
Copy pathlongest_arithmetic_subsequence.py
70 lines (55 loc) · 1.86 KB
/
longest_arithmetic_subsequence.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
"""
Longest Arithmetic Subsequence Problem: Given an array nums of integers, return the length of the longest arithmetic subsequence in nums.
Note that:
- A subsequence is an array that can be derived from another array by deleting some or no elements
without changing the order of the remaining elements.
- A sequence seq is arithmetic if seq[i + 1] - seq[i] are all the same value (for 0 <= i < seq.length - 1).
"""
def longest_arithmetic_subsequence(nums: list[int]) -> int:
"""
Finds the length of the longest arithmetic subsequence in a given array of integers.
Parameters
----------
nums : list[int]
The input array of integers.
Returns
-------
int
The length of the longest arithmetic subsequence.
Examples
--------
>>> longest_arithmetic_subsequence([3, 6, 9, 12])
4
>>> longest_arithmetic_subsequence([9, 4, 7, 2, 10])
3
>>> longest_arithmetic_subsequence([20, 1, 15, 3, 10, 5, 8])
4
>>> longest_arithmetic_subsequence([]) # Empty array
0
>>> longest_arithmetic_subsequence(None) # Null array
Traceback (most recent call last):
...
ValueError: Input array cannot be None
"""
if nums is None:
raise ValueError("Input array cannot be None")
if len(nums) == 0:
return 0
if len(nums) == 1:
return 1
dp = [{} for _ in range(len(nums))]
max_length = 2
for i in range(len(nums)):
for j in range(i):
diff = nums[i] - nums[j]
dp[i][diff] = dp[j].get(diff, 1) + 1
max_length = max(max_length, dp[i][diff])
return max_length
if __name__ == "__main__":
import doctest
doctest.testmod()
# sample test case
nums = [3, 6, 9, 12]
expected_length = 4
result = longest_arithmetic_subsequence(nums)
print("Length of longest arithmetic subsequence:", result)