题目
leetcode 413.等差数列划分
题目要素
给出数组nums,求其中长度>=3的等差且连续子数组个数
思路
差分 + 计数
如何判断nums数组中元素是否连续?
若nums[I] - nums[I-1] == nums[I-1] - nums[I-2],则nums[I],nums[I-1],nums[I-2]为连续元素,反之则不连续
如何求连续等差数组中子数组个数?
初始化:计数器cnt = 0,等差且连续子数组个数res = 0;
若nums=[1,2,3],即长度为3的等差数组,此时等差且连续子数组为[1,2,3],个数为1。则cnt++ ; res += cnt;
若nums=[1,2,3,4],即长度为4的等差数组,此时等差且连续子数组为[1,2,3],[2,3,4],[1,2,3,4],个数为3。cnt++; res += cnt;
若nums不连续,中间断开,则需要重新找连续元素,且置cnt = 0重新进行计数。
AC代码
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& nums) {
int n = nums.size();
if(n < 3)
return 0;
int res = 0, cnt = 0;
for(int i = 2; i < n; i++)
nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2] ? res += ++cnt : cnt = 0;
return res;
}
};