问题:
难度:medium
说明:
等差数组,输入一个数组,要求找出所有长度 >= 3 的不重复的等差子串(连续子序列)。
题目连接:https://leetcode.com/problems/arithmetic-slices/
输入案例:
Example:
A = [1, 2, 3, 4]
return: 3, for 3 arithmetic slices in A: [1, 2, 3], [2, 3, 4] and [1, 2, 3, 4] itself.
我的代码:
刷了周赛才明白,大佬是那么的多。
求连续区间解这种肯定是滑动窗口,内外两个遍历处理就行,while 内部做循环。
然后因为是找出长度 >= 3 子串,那么一个等差连续序列里面,长度(size) >= 3 且不重复的子串情况:
长度3 : size - 2 个
长度4: size - 3 个
..........
长度i: size - i + 1 个 ,这就相当于 ΣN 是一个等差数组相加的数学公式,只需要 (i - 1) * (i - 2) >> 1 就可以得出一个连续序列里面的(长度3以上不重复的)子串数量了
Java:
class Solution {
public int numberOfArithmeticSlices(int[] A) {
if(A.length < 3) return 0;
int len = A.length, count = 0, temp = 2, dis = A[1] - A[0];
boolean flag;
for(int i = 2;i < len;) {
flag = true;
while(i < len && A[i] - A[i - 1] == dis) {
i ++; temp ++; flag = false;
}
if(!flag) count += (temp - 1) * (temp - 2) >> 1;
if(i < len) {
dis = A[i] - A[i - 1]; temp = 2;
}
i ++;
}
return count;
}
}
C++:
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
if(A.size() < 3) return 0;
int len = A.size(), count = 0, size = 2, dis = A[1] - A[0], flag;
for(int i = 2; i < len;) { // 从2开始
flag = 0;
while(i < len && A[i] - A[i - 1] == dis) {
size ++; i ++; flag = 1;
}
if(flag) count += (size - 1) * (size - 2) >> 1;
if(i < len) {
dis = A[i] - A[i - 1]; size = 2; // 重置数据
}
i ++; // 必须要再加,否则下一次进来会经历同一个 i
}
return count;
}
};