LeetCode 413 Arithmetic Slices

本文介绍了一种高效算法来计算给定数组中所有长度大于3的等差数列子序列的数量,并提供了详细的解题思路及实现代码。

原题链接: 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;
    }

复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值