LeetCode-413. Arithmetic Slices

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36783389/article/details/82937535

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.

测试样例比较水只有15个要不然我感觉这样的时间复杂度可能会超时笑哭脸

solution:

class Solution {
    public int numberOfArithmeticSlices(int[] A) {
        if(A.length<3) //如果数组长度小于3的话肯定没有等差数列所以返回0
            return 0;
        int all = 0;  //最后要返回的结果
        int d = 0;    //公差
        int num = 1;  //保存当前数列里数的个数
        int head = 0; //保存当前数列列首
        while(head<A.length-2){
            for(int i=head;i<A.length-1;i++){
                if(num==1){  //当num等于1时是作为求当前数列公差的判断条件,如果num不等于1就应该将后续元素的差值与公差d作对比了
                    d = A[i+1]-A[i];
                    num++;
                }else{
                    if(d == A[i+1]-A[i]){
                        num++;
                        if(num>=3)
                            all+=1;
                    }else {  //因为等差数列是连续的所以如果不等差了就退出了但是退出前将num置为1即将下一个head元素入列
                        num = 1;
                        break;
                    }
                }

                if(i==A.length-2)
                    num=1;
            }
            head++;  //for循环遍历以后要让head++即找以下一个元素为首的等差数列
        }
        return all;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36783389/article/details/82937535