413.Arithmetic Slices

413.题目

Arithmetic Slices

计网实验的教室没开空调热到我上leetcode做题解暑qaq

解题思路

这道题也是动态规划的(动态规划的题目好多

简单来说就是给出一串数字有多少组“3个数字以上”且“间隔相同”的数字。

我的思路就是遍历,假设第i个数字和前面2个数字(即第i-1、i-2个数字)间隔相同,那么说明他们符合条件,这时还要再看一下第i-2个数字之前是否存在与第i-2个元素连续的数字使得第k~i个数字是间隔相同(k < i-2)。若存在,则couter += (i-2)-k+1;若不存在则 couter += 0。

判断前面是否存在“与第i-2个元素连续的数字使得第k~i个数字是间隔相同(k < i-2)“可以用个变量continus来标识”连续数字的长度-2”,但如果第i个数字与前面2个数字不间隔相同,continus置0。

举个例子,[1,2,3,4,7,8,9,0]

从第3个数字开始遍历,
初始值:i = 2,continus = 0, couter = 0

i连续数字continuscouter
2[1,2,3]11
3[1,2,3,4]23
4[7]03
5[8]03
6[7,8,9]14
7[0]04

具体代码

  • 非递归版本
class Solution {
public:

    int numberOfArithmeticSlices(vector<int>& A) {
        int couter = 0;
        int continus = 0;
        for (int i = 2; i < A.size(); i++) {
            if (A[i] - A[i-1] == A[i-1] - A[i-2]) {
                if (continus) {
                    ++continus;
                    couter += continus;
                }
                else {
                    ++couter;
                    continus = 1;
                }
            }
            else {
                continus = 0;
            }
        }

        return couter;
    }
};

(讲道理这里没啥必要用递归
- 递归版本

class Solution {
public:
    int maxlen[5000] = {0}; // 记录从第i个元素开始有多少个连续间隔相同的数字

    int getMaxLength(vector<int>& A, int start, int len) {

        if (len > 3) {
            int con1 = getMaxLength(A, start + 1, len - 1);
            int con2 = A[start] - A[start + 1] == A[start + 1] - A[start + 2];
            if (con2)
                if (con1 < 3)
                    maxlen[start] = 3;
                else
                    maxlen[start] = con1 + 1;

        }
        else if (len == 3)
            if (A[start] - A[start + 1] == A[start + 1] - A[start + 2])
                maxlen[start] = 3;

        return maxlen[start];
    }

    int numberOfArithmeticSlices(vector<int>& A) {
        getMaxLength(A, 0, A.size());
        int couter = 0;
        for (int i = 0; i < A.size(); i++) {
            if (maxlen[i] >= 3)
                couter += maxlen[i] - 2;
        }
        return couter;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值