Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目
如果一个数列至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。
例如,[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;
}
}
复制代码
提交后反馈结果:
参考信息
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END