413. 等差数列划分

给定一个整数数组nums,程序需要找出并返回所有等差子数组的个数。等差数组定义为任意两个相邻元素之间的差相等。例如,输入[1,2,3,4]将返回3,因为有三个等差子数组:[1,2,3]、[2,3,4]和[1,2,3,4]。代码通过遍历数组,检查连续元素间差值是否相等来实现这一功能,使用变量t和sum来跟踪和计数等差子数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值