https://leetcode-cn.com/problems/arithmetic-slices/
dp[i] 代表以 nums[i] 结尾的等差子数组的个数。
至少有三个元素
如果 nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2] 则构成等差数组。
有 dp[i] = dp[i - 1] + 1。
class Solution:
def numberOfArithmeticSlices(self, nums: List[int]) -> int:
n = len(nums)
if n < 3:
return 0
dp = [0 for i in range(n)]
for i in range(2, n):
if nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2]:
dp[i] = dp[i - 1] + 1
return sum(dp)- 时间复杂度: O(n)
- 空间复杂度: O(n)
求连续的子数组, 其实还是滑动窗口比较符合我的思维定式。
pre 表示等差子数组的个数。
如果和前面构成了等差子数组, 就叠加。
没构成等差子数组, 直接清零。🆑
class Solution:
def numberOfArithmeticSlices(self, nums: List[int]) -> int:
n = len(nums)
if n < 3:
return 0
ans = 0
pre = 0
for i in range(2, len(nums)):
if nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2]:
pre += 1
else:
pre = 0
ans += pre
return ans- 时间复杂度: O(n)
- 空间复杂度: O(1)
