文章目录
problem
413. Arithmetic Slices
An integer array is called arithmetic if it consists of at least three elements and if the difference between any two consecutive elements is the same.
For example, [1,3,5,7,9], [7,7,7,7], and [3,-1,-5,-9] are arithmetic sequences.
Given an integer array nums, return the number of arithmetic subarrays of nums.
A subarray is a contiguous subsequence of the array.
Example 1:
Input: nums = [1,2,3,4]
Output: 3
Explanation: We have 3 arithmetic slices in nums: [1, 2, 3], [2, 3, 4] and [1,2,3,4] itself.
Example 2:
Input: nums = [1]
Output: 0
approach 1 brute force
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& nums) {
if(nums.size() < 3)return 0;
vector<int> diff(nums.size());
diff[0] = -114514;
for(int i=1; i<nums.size(); i++)
diff[i] = nums[i]-nums[i-1];
int res = 0, i=2;
while(i < nums.size()){
int cnt = 1;
while(i < nums.size() && diff[i-1]==diff[i])
++cnt, ++i;
if(cnt > 1) res += (cnt*(cnt-1))/2;
else ++i;
}
return res;
}
};

approach 2 without extra space
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& nums) {
if(nums.size() < 3)return 0;
int res = 0, cnt = 1;
for(int i=2; i<nums.size(); i++){
if(nums[i]+nums[i-2] == 2*nums[i-1]){
++cnt;
}else{
res += (cnt*(cnt-1))/2;
cnt = 1;
}
}
if(cnt > 1) res +=(cnt*(cnt-1))/2;
return res;
}
};

approach 3 shortest code, but not best
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& nums) {
if(nums.size() < 3)return 0;
int res = 0;
for(int i=2, j=1; i<nums.size(); i++){
if(nums[i]+nums[i-2] != 2*nums[i-1])
j=i;
res += i-j;
}
return res;
}
};

这篇博客探讨了如何解决LeetCode的413题——等差数列子序列。提供了三种不同的解决方案:暴力求解、不使用额外空间的方法以及最短代码实现。每种方法都详细解释了其工作原理,并通过示例输入和输出展示了它们的正确性。这些算法主要涉及数组处理和动态规划思想。
733

被折叠的 条评论
为什么被折叠?



