Skip to content

Latest commit

 

History

History
77 lines (57 loc) · 1.67 KB

File metadata and controls

77 lines (57 loc) · 1.67 KB

LC.413 等差数列划分

https://leetcode-cn.com/problems/arithmetic-slices/

题目描述

截屏0003-08-12 14 49 20

动态规划

思路

动态初始化

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)