[Leetcode学习-c++&java]Arithmetic Slices

问题:

难度: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;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_28033719/article/details/113849984