413. 等差数列划分

2023-01-03  本文已影响0人  spark打酱油

1.题目

如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。

例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。
给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组个数。子数组是数组中的一个连续序列。

实例1:

输入:nums = [1,2,3,4]
输出:3
解释:nums 中有三个子等差数组:[1, 2, 3]、[2, 3, 4] 和 [1,2,3,4] 自身。

实例2:

输入:nums = [1]
输出:0
提示:
1 <= nums.length <= 5000
-1000 <= nums[i] <= 1000

2.思路

3.代码

  def numberOfArithmeticSlices(nums: Array[Int]): Int = {
    var len = nums.length
    if(len<3) return 0
    // dp[i]表示以:nums(i结尾的,且长度大于等于3的连续等差数列的个数
    val dp = new Array[Int](len)
    var res = 0
    // 从下标2开始,才有可能构成长度至少大于等于3的等差数列
    for(i<-2 until(len)){
      if(nums(i)-nums(i-1)==nums(i-1)-nums(i-2)){
        dp(i)=dp(i-1)+1
        res = res + dp(i)
      }
    }
    return res
  }

4.复杂度分析

时间复杂度:O(N),这里 N 是输入数组的长度;
空间复杂度:O(N)。由于 dp[i] 只参考了 dp[i - 1],可以使用「滚动变量」优化空间复杂度。

上一篇 下一篇

猜你喜欢

热点阅读