動機
如果沒有大於3的限制就很簡單 同時,又是一題只能用bottom-up的dp
Problem
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: 7Explanation: 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: 16Explanation: Any subsequence of this array is arithmetic.
Constraints:
1 <= nums.length <= 1000
-231 <= nums[i] <= 231 - 1
Sol
這裡的重點是長度大於3 所以利用從buttom-up時,前一個會被建構好這件事,去取答案
class Solution:
def numberOfArithmeticSlices(self, nums: List[int]) -> int:
dp = defaultdict(lambda : defaultdict(int))
ret = 0
for i in range(len(nums)):
for j in range(i):
diff = nums[i]-nums[j]
ret += dp[j][diff] # Use all comb whose size is bigger than 1 to construct this case!!
dp[i][diff] += dp[j][diff]+1
return ret