LeetCode学习篇八—— Arithmetic Slices

该博客介绍了LeetCode中关于Arithmetic Slices的问题,讲解如何找出数组中长度不小于3的等差数列,并提供了解题思路和规律总结,最后给出了O(n)复杂度的解决方案。
摘要由CSDN通过智能技术生成

题目: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:

1, 3, 5, 7, 9
7, 7, 7, 7
3, -1, -5, -9

The following sequence is not arithmetic.

1, 1, 2, 5, 7

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:

A = [1, 2, 3, 4]
return: 3, for 3 arithmetic slices in A: [1, 2, 3], [2, 3, 4] and [1, 2, 3, 4] itself.

难度:medium 通过率:53.3%

这道题的题目写了很多东西,一开始看了是不知道要求什么的 ,然后再看了一下例子,原来粗暴地理解就是要求所给序列里存在多少个长度不小于3的等差数列 。
想着从头到尾遍历一次,但是怎么判断符合条件子序列的数目呢?
于是列了几个例子总结出了规律:

序列符合子序列数目规律
[1,2,3]11
[1,2,3,4]31+2
[1,2,3,4,5]61+2+3
[1,2,3,4,5,6]101+2+3+4

由以上表格可知,如果成连续子序列每多一个元素即在原来的数目上加一个递增的数,从0开始递增,所以,可以直接从头开始遍历序列,用变量temp记录递增数,count记录总数目,当下一个数和前面的序列不成等差数列时,temp再次等于0,由此遍历下去。代码如下,复杂度O(n)

class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& A) { 
        int size = A.size();
        int count = 0;
        int temp = 0; 
        if(size < 3) {
            return 0;
        }
        int diff = A[1]-A[0]; 
        for(int i = 2; i < size; i++) {
            if(A[i]-A[i-1] == diff) {
                temp++;
                count += temp;
            }
            else {
                diff = A[i]-A[i-1];
                temp = 0;
            }
        }   
        return count;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值