LeetCode——413. 等差数列划分(Arithmetic Slices)[中等]——分析及代码(Java)

LeetCode——413. 等差数列划分[Arithmetic Slices][中等]——分析及代码[Java]

一、题目

如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。

  • 例如,[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% 的用户。

三、其他

暂无。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值