413.Arithmetic Slices

来源:互联网 发布:淘宝 全球购 费用 编辑:程序博客网 时间:2024/06/11 18:01

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 连续数字 continus couter 2 [1,2,3] 1 1 3 [1,2,3,4] 2 3 4 [7] 0 3 5 [8] 0 3 6 [7,8,9] 1 4 7 [0] 0 4

具体代码

  • 非递归版本
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;    }};
原创粉丝点击