等差数列划分--关于子串的数量规律

本文介绍了两种解决等差数列子序列问题的方法。第一种是深度优先搜索(DFS)的暴力解法,虽然时间复杂度较高为O(N^2)。第二种方法利用子串数量规律,通过一次遍历实现O(N)的时间复杂度,显著提高了效率。这两种解法针对数组中寻找等差序列的子序列提供了不同的思路。
摘要由CSDN通过智能技术生成

题目

解法一:dfs暴力解法 O(N^2)

class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& nums) {
        int n = nums.size();
        if(n<3)return 0;
        int gap[n];
        memset(gap,0,sizeof gap);
        int index = 1;
        //把数组的所有相邻差值记录下来
        for(int i=0;i<n-1;i++){
            gap[index++] = nums[i+1]-nums[i];
        }
        int cnt = 0;
        //dfs爆搜
        function<void(int ,int)> dfs = [&](int k,int pos){
            if(k>=1)
                cnt++;
            if(pos>n-1)
                return;
            if(gap[pos]==gap[pos-1])
                dfs(k+1,pos+1);
        };
        for(int i=2;i<n;i++){
            dfs(0,i);
        }
        return cnt;
    }
};

解法二:利用子串数量规律实现O(N)

手写解析

class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& nums) {
        int n = nums.size();
        if (n == 1) {
            return 0;
        }

        int d = nums[0] - nums[1], t = 0;
        int ans = 0;
        // 因为等差数列的长度至少为 3,所以可以从 i=2 开始枚举
        for (int i = 2; i < n; ++i) {
            if (nums[i - 1] - nums[i] == d) {
                ++t;
            }
            else {
                d = nums[i - 1] - nums[i];
                t = 0;
            }
            ans += t;
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值