413.题目
计网实验的教室没开空调热到我上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;
}
};