446. Arithmetic Slices II - Subsequence
Description
Given an integer array nums, return the number of all the arithmetic subsequences of nums.
A sequence of numbers is called arithmetic if it consists of at least three elements and if the difference between any two consecutive elements is the same.
- For example,
[1, 3, 5, 7, 9],[7, 7, 7, 7], and[3, -1, -5, -9]are arithmetic sequences. - For example,
[1, 1, 2, 5, 7]is not an arithmetic sequence.
A subsequence of an array is a sequence that can be formed by removing some elements (possibly none) of the array.
- For example,
[2,5,10]is a subsequence of[1,2,1,2,4,1,5,10].
The test cases are generated so that the answer fits in 32-bit integer.
Example 1:
Input: nums = [2,4,6,8,10] Output: 7 Explanation: All arithmetic subsequence slices are: [2,4,6] [4,6,8] [6,8,10] [2,4,6,8] [4,6,8,10] [2,4,6,8,10] [2,6,10]
Example 2:
Input: nums = [7,7,7,7,7] Output: 16 Explanation: Any subsequence of this array is arithmetic.
Constraints:
1 <= nums.length <= 1000-231 <= nums[i] <= 231 - 1
Solutions
Solution 1
Thinking
Subsequences need not be contiguous and the difference can be huge, so listing every length-\(\ge 3\) subsequence is impossible. \(n\le 1000\) allows \(O(n^2)\).
Let \(f[i][d]\) be the number of weak arithmetic subsequences (at least two terms) ending at \(i\) with difference \(d\). For \(j<i\) and \(d=nums[i]-nums[j]\), the \(f[j][d]\) sequences become real slices once \(nums[i]\) is appended, and \(f[i][d]\) grows by \(f[j][d]+1\) (including the new pair).
Differences live in hash maps. Add \(f[j][d]\) to the answer before updating \(f[i][d]\), so weak sequences and true slices are handled in one double loop.
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |