C++中的算术切片
假设我们有一串数字,如果它至少包含三个元素,并且任何两个连续元素之间的差值相同,则称其为算术序列。例如,这些是算术序列:[1, 3, 5, 7, 9],[7, 7, 7, 7],[3, -1, -5, -9],但以下序列不是算术序列:[1, 1, 2, 5, 7]
现在给定一个包含N个数字的零索引数组A。给定数组的切片是任何整数对(P, Q),使得0 <= P < Q < N。这里数组A的切片(P, Q)被称为算术切片,如果序列:A[P],A[p + 1],...,A[Q - 1],A[Q]是算术的。该函数应该找到数组A中算术切片的数量。
因此,如果输入类似于[1,2,3,4],则输出将为3,因为元素为[1,2,3],[2,3,4]和[1,2,3,4]
为了解决这个问题,我们将遵循以下步骤:
- ret := 0, n := A的大小,创建一个大小为n的数组dp
- 对于范围从2到n – 1的i
- 如果a[i] – a[i – 1] = a[i – 1] – a[i – 2],则
- dp[i] := 1 + dp[i - 1]
- 将ret增加dp[i]
- 如果a[i] – a[i – 1] = a[i – 1] – a[i – 2],则
- 返回ret
示例 (C++)
让我们看看下面的实现,以便更好地理解:
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
int ret = 0;
int n = A.size();
vector <int> dp(n);
for(int i = 2; i < n; i++){
if(A[i] - A[i - 1] == A[i - 1] - A[i - 2]){
dp[i] = 1 + dp[i - 1];
ret += dp[i];
}
}
return ret;
}
};
main(){
vector<int> v = {1,2,3,4};
Solution ob;
cout << (ob.numberOfArithmeticSlices(v));
}输入
[1,2,3,4]
输出
3
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C编程
C++
C#
MongoDB
MySQL
Javascript
PHP