统计好元组

题目描述

现在给定一个数组arr,和a,b两个数字,你要做的就是找到(i,j,k)。且满足
1. 0 <= i < j < k < arr.size()
2. |arr[i] - arr[j]| <= a
3. |arr[j] - arr[k]| <= b
统计满足条件的个数并返回(最后结果可能很大,请取1000000007的余数)。

样例1

输入
[7,1,8,9,0],3,3
返回值
1

说明

只有(7,8,9)符合要求

备注:

0 < m < 100
0 < n < 2000

题解

对于本题,我们最先想到的一定是暴力的遍历方法,那么时间复杂度则会达到 O(n3),结合本题数据,这是不可行的,所以我们必须考虑优化。那么就可以想到题目要求中与 i , k 均有关的 j ,只需要分别计算左侧满足条件1和右边条件2的数量x , y,则 ans += x*y,具体代码如下:

int countTriplets(vector<int>& arr, int a, int b) {
        const int MOD = 1000000007;
        int n = arr.size();
        long long  ans = 0;
        for (int j = 1; j < n - 1; j++) {
            long  long x = 0;
            long  long y = 0;
            for (int i = 0; i < j; i++) {
                if(abs(arr[i] - arr[j]) <= a)
                    x++;
            }
            for (int k = j + 1; k < n; k++) {
                if (abs(arr[k] - arr[j]) <= b)
                    y++;
            }
            ans += x * y;
            ans %= MOD;
        }
        return (int)(ans%MOD);
    }
全部评论

相关推荐

尊尼获获:闺蜜在哪?
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务