mirror of
https://github.com/TheAlgorithms/Python.git
synced 2025-03-25 07:59:50 +00:00
85 lines
2.2 KiB
Python
85 lines
2.2 KiB
Python
"""
|
|
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: list[dict[int, int]] = [{} 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()
|
|
|
|
# test cases
|
|
test_cases = [
|
|
([3, 6, 9, 12], 4),
|
|
([3, 6, 9, 12, 15], 5),
|
|
([1, 7, 10, 13, 14, 19], 4),
|
|
([1, 2, 3, 4], 4),
|
|
([], 0),
|
|
([10], 1),
|
|
([9, 4, 7, 2, 10], 3),
|
|
([1, 2, 2, 2, 2, 5], 4),
|
|
]
|
|
|
|
for nums, expected_length in test_cases:
|
|
result = longest_arithmetic_subsequence(nums)
|
|
print(f"Test case {nums}: Expected {expected_length}, Got {result}")
|
|
assert result == expected_length, f"Test failed for input {nums}"
|
|
|