LeetCode 413.Arithmetic Slices 解题报告

本文介绍了解决LeetCode 413题目的方法,该题要求找出数组中所有构成等差数列的子数组。通过一次遍历并维护一个计数器来高效解决问题。

LeetCode 413. Arithmetic Slices 解题报告

题目描述

A sequence of number is called arithmetic if it consists of at least three elements and if the difference between any two consecutive elements is the same.

For example, these are arithmetic sequence:
description1
The following sequence is not arithmetic.
description2

A zero-indexed array A consisting of N numbers is given. A slice of that array is any pair of integers (P, Q) such that 0 <= P < Q < N.

A slice (P, Q) of array A is called arithmetic if the sequence:
A[P], A[p + 1], …, A[Q - 1], A[Q] is arithmetic. In particular, this means that P + 1 < Q.

The function should return the number of arithmetic slices in the array A.


示例

example


限制条件

没有明确给出.


解题思路

我的思路:

这道题的题目不是一般的长,其实就是一个意思:给你一串数字,返回这串数字中能够构成等差数列的子串的数目。
我的想法是通过扫描一遍数组就能得到结果,所以得先知道如果扫描发现下一个数字能够加入到等差数列中,那么总的数目会有怎样的变化。
因此,我列出了下表:

数组等差数列的数目与上一数组的等差数列数目比较
1 2 311 - 0 = 1
1 2 3 433 - 1 = 2
1 2 3 4 566 - 3 = 3
1 2 3 4 5 61010 - 6 = 4
1 2 3 4 5 6 71515 - 10 = 5

观察就能发现两个等差数列数目之差(表格第三列)就是[1,2, 3, 4, 5……]这个序列,因此每次增加一个等差数列的元素,总的等差数列的数目就会增加[1,2, 3, 4, 5……]中对应的数值。

按照这一点,在代码实现时就设置一个变量addend,表示增加的数目,它对应着[1,2, 3, 4, 5……]这个序列,如果下一个数组元素能够加入到等差数列中,addend就自增1,然后总的数目就增加addend。如果下一个数组元素不能加入到等差数列中,addend就重置为0。这样通过一个循环就能获得结果。

做完看了看其他人的代码,目前发现的最好的解法就是跟我一样的,似乎还没有更好的,其他稍复杂的解法就不贴出来了。


代码

我的代码

class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& A) {
        int count = 0;
        int addend = 0;

        for (int i = 2; i < A.size(); i++)
            if (A[i - 1] - A[i] == A[i - 2] - A[i - 1])
                count += ++addend;
            else 
                addend = 0;

        return count;
    }
};

总结

这道新题虽然长,但是看懂了之后会发现其实不难,就是找找规律而已,所以在纸上写写就能很快做出来了。
今天填了好几个坑,会写两篇解题报告,继续写下一篇!加油加油!

评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值