413. 等差数列划分
如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。
例如,[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
题解:
t是用来记录是否有等差数组的,sum也是,sum是每逢三个形成等差数组就记录一次,不包括有连续的四个及以上的情况,而t则是不仅记录 包括有三个元素的子等查数组 而且包括有当sum向后移动一位并且仍是等差子数组,而此时实际上构成了四个连续的等差元素,这也是一个等差子数组的情况也同样记录
例如[1,2,3,6,2,3,4]这种中间出现断层的情况,就要将sum归零,sum就相当于一个计算是不是等差的工具(范围只有3),由t来收集连续计算(3个及以上元素连续等差的情况)的结果,每一次连续计算的结束或者说开始,都要将sum重新归零,因为t是收集连续结果的,当不连续了也就要从0开始计算了
/**
* @param {number[]} nums
* @return {number}
*/
var numberOfArithmeticSlices = function(nums) {
let sum = 0;
let t = 0;
if (nums.length < 3) {
return 0;
}
for (let i = 0; i < nums.length; i++) {
if (nums[i] - nums[i + 1] == nums[i + 1] - nums[i + 2]) {
// console.log("形成的等差子数组是:", nums[i], nums[i + 1], nums[i + 2]);
t += ++sum;
//t是用来记录是否有等差数组的,sum也是,sum是每逢三个形成等差数组就记录一次,不包括有连续的四个及以上的情况,而t则是不仅记录 包括有三个元素的子等查数组 而且包括有当sum向后移动一位并且仍是等差子数组,而此时实际上构成了四个连续的等差元素,这也是一个等差子数组的情况也同样记录,
}else{
sum=0;//例如[1,2,3,6,2,3,4]这种中间出现断层的情况,就要将sum归零,sum就相当于一个计算是不是等差的工具(范围只有3),由t来收集连续计算(3个及以上元素连续等差的情况)的结果,每一次连续计算的结束或者说开始,都要将sum重新归零,因为t是收集连续结果的,当不连续了也就要从0开始计算了
}
}
// if (sum == nums.length - 1) {
// console.log("这是一个等差数列");
// }
// console.log("sum:", sum);
// console.log("t:", t);
return t;
};