我们观察下面的数据长度,那么平方级别时间应该是足够了。
这里示例给了一个很好的例子,可以看出是可以重复的。我们选定一个以x结尾的序列,遍历它前面的数字y,设公差为d,那么以y结尾的所有序列且公差为d的序列个数加1就是以x结尾的公差为d的个数。
需要注意的是,这里公差可能的范围非常大,将二维数组的第二维度换成字典保存公差d,这样就得到下列代码,需要注意的是,最终结果是返回所有可以成为等差序列的序列个数。
class Solution:
def numberOfArithmeticSlices(self, nums: List[int]) -> int:
ans = 0
f = [{} for _ in range(len(nums))]
for i in range(len(nums)):
for j in range(i):
d = nums[i] - nums[j]
cnt = f[j].get(d,0)
ans += cnt
f[i][d]=f[i].get(d,0)+cnt+1
return ans