C ++中的算术切片
假设我们有一个数字序列,如果它由至少三个元素组成并且任意两个连续元素之间的差相同,则称为算术序列。因此,例如,这些是算术序列:[1、3、5、7、9],[7、7、7、7],[3,-1,-5,-9],但是以下序列不是算术。[1、2、5、7]
现在给出了一个由N个数字组成的零索引数组A。该给定数组的一个切片是任意一对整数(P,Q),使得0<=P<Q<N。这里,如果序列A[P],则将数组A的切片(P,Q)称为算术运算: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的范围内时
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