【动态规划】leetcode.413 等差数列划分
https://leetcode.cn/problems/arithmetic-slices/
动态规划的思想:
当前i~j的范围内是等差数列,公差是d,
那么就判断j+1和j的差值是否满足d,
如果是的话:
那么等差数列的个数就变为t+1,
t是在原有的等差数列之后加上j+1,
1是最后三个数字组成的等差数列,即:j-1 j j+1
如果不是的话:
那么j+1的值-j的值就是新的等差数列的差值d(因为子数组要求连续),这个新的等差数列的个数因为只有两个数,所以就是0
所以计算顺序:从左到右
递推公式:t=t+1(nums[i]-nums[i+1]=d)||t=0(nums[i]-nums[i+1]!=d)
初始化 d=nums[0]-nums[1] ,t=0
class Solution {
public int numberOfArithmeticSlices(int[] nums) {
int n=nums.length;
if(n==1)
return 0;
int d=nums[0]-nums[1];
int res=0;
int t=0;
for(int i=2;i<n;i++){
if(nums[i-1]-nums[i]==d){
t+=1;
}else{
d=nums[i-1]-nums[i];
t=0;
}
res+=t;
}
return res;
}
}
时间复杂度o(N)