LeetCode 413 Arithmetic Slices

340 阅读1分钟

原题链接: Arithmetic Slices

题目大意:

题目说了一大堆,其实都是在给定义,目标就一句话:

求一个给定数组中可以组成多少个等差数列(长度大于3)

解题思路:

首先呢,一个长度为n的等差数列,设m=n-2,则包括子数列在内,一共可以组成m*(1+m)/2个长度大于3的等差数列,简单的数列求和。

然后只要知道数组中每个等差数列的长度即可。

设置两个标记start和end,分别代表当前等差数列的开始和结束为止。

设置标记sub,记录数列差值,当差值与上次不等时,将start设置为end-1,即为重新开始一个新的数列。此时应将上一数列的统计数目添加到总数count中。

AC代码:

/**
     * 413. Arithmetic Slices
     * @param A
     * @return
     */
    public static int numberOfArithmeticSlices(int[] A){

        if(A.length<3)
            return 0;

        int start = 0,end = 1;
        int sub = A[end]-A[start],count=0;

        for(end = 1;end <A.length;end++){
            if(A[end]-A[end-1]!=sub||end == A.length-1){
                if(end-start>=2){
                    int l = end-start-1;
                    if(A[end]-A[end-1]!=sub){
                        l-=1;
                    }
                    count+= l*(1+l)/2;
                }
                start = end-1;
                sub = A[end]-A[start];
            }
        }

        return count;
    }