题目
如果一个数列至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,[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
题解
解题分析
题解思路
1、边界值判断,首先需要判断数组长度大于等于 3;
2、已知数组是有序的数组,那么我们可以通过判断 nums[i - 1]
和 nums[i]
、nums[i + 1]
前后的差值是否相等,判断是否等差数列;
3、对于连续的数据数据我们可以通过变量 t
进行累积,判断当前子序列之中的有序情况;
4、最后累积结果得到最终的答案。
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
解题代码
题解代码如下(代码中有详细的注释说明):
class Solution { public int numberOfArithmeticSlices(int[] nums) { // 数组长度 int len = nums.length; // 不符合最小子数组长度 if (len < 3) { return 0; } // d 是等差数列的 差值 // t 是累积连续子数组的长度 // ans 是返回结果 int d = nums[1] - nums[0], t = 0, ans = 0; for (int i = 2; i < len; i++) { // 如果等差数列的等差相同 if (nums[i] - nums[i - 1] == d) { // 增加子数组内累积 t++; } else { // 如果不符合 d = nums[i] - nums[i - 1]; // 清空累积 t = 0; } // 返回结果累积加 ans += t; } return ans; } }
提交后反馈结果: