一、题目
如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。
- 例如,[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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/arithmetic-slices
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 直接计数
(1)思路
因为等差数列是一个连续序列,可在依次遍历数组中各元素时,判断当前元素与之前的元素是否可构成等差数列,并记录当前可构成的等差数列的最大长度。
若当前元素可参与构成等差数列且最大长度为 l,因为等差数列长度至少为 3,则包含该元素的子数组个数为 l - 2。根据这一规律,依次计数即可。
(2)代码
class Solution {
public int numberOfArithmeticSlices(int[] nums) {
if (nums.length < 3)//等差数列长度至少为3
return 0;
int n = nums.length, ans = 0, len = 0;//ans为子数组总数,len为当前等差数列长度-2
for (int i = 2; i < n; i++) {
if (nums[i] == 2 * nums[i - 1] - nums[i - 2])//该元素与之前的元素可构成等差数列
ans += ++len;//当前等差数列长度+1,子数组数量+len(当前等差数列长度为len+2,因为等差数列长度至少为3,包含该元素的子数组个数为len+2-2=len)
else//该元素与之前的元素不构成等差数列
len = 0;//归零
}
return ans;
}
}
(3)结果
执行用时 :0 ms,在所有 Java 提交中击败了 100.00% 的用户;
内存消耗 :36 MB,在所有 Java 提交中击败了 85.83% 的用户。
三、其他
暂无。