数组题目:统计好三元组

题目

标题和出处

标题:统计好三元组

出处:1534. 统计好三元组

难度

1 级

题目描述

要求

给你一个整数数组 arr \texttt{arr} arr,以及 a \texttt{a} a b \texttt{b} b c \texttt{c} c 三个整数。请你统计其中好三元组的数量。

如果三元组 (arr[i],   arr[j],   arr[k]) \texttt{(arr[i], arr[j], arr[k])} (arr[i], arr[j], arr[k]) 满足下列全部条件,则认为它是一个好三元组

  • 0 ≤ i < j < k < arr.length \texttt{0} \le \texttt{i} < \texttt{j} < \texttt{k} < \texttt{arr.length} 0i<j<k<arr.length
  • |arr[i]   -   arr[j]| ≤ a \texttt{|arr[i] - arr[j]|} \le \texttt{a} |arr[i] - arr[j]|a
  • |arr[j]   -   arr[k]| ≤ b \texttt{|arr[j] - arr[k]|} \le \texttt{b} |arr[j] - arr[k]|b
  • |arr[i]   -   arr[k]| ≤ c \texttt{|arr[i] - arr[k]|} \le \texttt{c} |arr[i] - arr[k]|c

其中 |x| \texttt{|x|} |x| 表示 x \texttt{x} x 的绝对值。

返回好三元组的数量

示例

示例 1:

输入: arr   =   [3,0,1,1,9,7],   a   =   7,   b   =   2,   c   =   3 \texttt{arr = [3,0,1,1,9,7], a = 7, b = 2, c = 3} arr = [3,0,1,1,9,7], a = 7, b = 2, c = 3
输出: 4 \texttt{4} 4
解释:一共有 4 \texttt{4} 4 个好三元组: [(3,0,1),   (3,0,1),   (3,1,1),   (0,1,1)] \texttt{[(3,0,1), (3,0,1), (3,1,1), (0,1,1)]} [(3,0,1), (3,0,1), (3,1,1), (0,1,1)]

示例 2:

输入: arr   =   [1,1,2,2,3],   a   =   0,   b   =   0,   c   =   1 \texttt{arr = [1,1,2,2,3], a = 0, b = 0, c = 1} arr = [1,1,2,2,3], a = 0, b = 0, c = 1
输出: 0 \texttt{0} 0
解释:不存在满足所有条件的三元组。

数据范围

  • 3 ≤ arr.length ≤ 100 \texttt{3} \le \texttt{arr.length} \le \texttt{100} 3arr.length100
  • 0 ≤ arr[i] ≤ 1000 \texttt{0} \le \texttt{arr[i]} \le \texttt{1000} 0arr[i]1000
  • 0 ≤ a,   b,   c ≤ 1000 \texttt{0} \le \texttt{a, b, c} \le \texttt{1000} 0a, b, c1000

解法

思路和算法

这道题目要求统计给定的整数数组 arr \textit{arr} arr 中的好三元组的数量。一个好三元组对应一个下标的三元组 ( i , j , k ) (i,j,k) (i,j,k),三个下标满足题目给定的条件。遍历数组中的每一个三元组,统计好三元组的数量即可。

代码

class Solution {
    public int countGoodTriplets(int[] arr, int a, int b, int c) {
        int triplets = 0;
        int length = arr.length;
        for (int i = 0; i < length; i++) {
            int num1 = arr[i];
            for (int j = i + 1; j < length; j++) {
                int num2 = arr[j];
                if (Math.abs(num1 - num2) <= a) {
                    for (int k = j + 1; k < length; k++) {
                        int num3 = arr[k];
                        if (Math.abs(num2 - num3) <= b && Math.abs(num1 - num3) <= c) {
                            triplets++;
                        }
                    }
                }
            }
        }
        return triplets;
    }
}

复杂度分析

  • 时间复杂度: O ( n 3 ) O(n^3) O(n3),其中 n n n 是数组 arr \textit{arr} arr 的长度。需要使用三重循环遍历数组 arr \textit{arr} arr,对于每个三元组,可以确保下标的大小关系满足好三元组的要求,需要 O ( 1 ) O(1) O(1) 的时间判断三个元素的值是否满足好三元组的要求。

  • 空间复杂度: O ( 1 ) O(1) O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟大的车尔尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值