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: Dynamic Programming
- Time complexity: O(n2)
- Space complexity: O(n2)
JavaScript
js
/**
* @param {number[]} nums
* @return {number}
*/
const numberOfArithmeticSlices = function (nums) {
const n = nums.length;
const dp = new Array(n)
.fill('')
.map(_ => new Map());
let result = 0;
const getCount = (map, diff) => map.get(diff) ?? 0;
for (let a = 1; a < n; a++) {
const numA = nums[a];
for (let b = 0; b < a; b++) {
const numB = nums[b];
const diff = numA - numB;
const count = getCount(dp[b], diff);
result += count;
dp[a].set(diff, getCount(dp[a], diff) + count + 1);
}
}
return result;
};