数组题目:统计好三元组

题目

标题和出处

标题:统计好三元组

出处: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)

### C语言中的三元组概念 在C语言编程中,“三元组”的定义取决于具体的应用场景。通常情况下,三元组指的是由三个元素组成的集合,在不同的上下文中可能有不同的含义。 #### 定义与特性 对于给定的任务或问题而言,三元组可以被理解为一种特殊的数据结构形式——即包含有三个成员变量的实体。当处理特定类型的逻辑运算时(如组合匹配),这些成员往往代表一组相互关联的信息片段[^1]。 #### 实现方式 为了实现这样的功能需求,可以通过多种途径来创建和操作所谓的“三元组”。最常见的方式之一就是使用结构体(struct),因为这允许程序员自定义数据类型,并为其分配多个字段以存储所需信息: ```c // 定义一个名为 Triplet 的结构体用于表示三元组 typedef struct { int first; int second; int third; } Triplet; int main() { // 创建一个新的三元组实例并初始化其值 Triplet triplet = {1, 2, 3}; printf("Triplet values are %d, %d and %d\n", triplet.first, triplet.second, triplet.third); return 0; } ``` 这段代码展示了如何通过声明 `struct` 来构建一个简单的三元组模型,并对其进行基本的操作,比如赋值和打印输出。 另外,在某些应用场景下也可能采用数组的形式来表达类似的多维关系型数据集;然而,相较于直接运用结构体的方法来说,这种方式缺乏灵活性且不易维护扩展性较差[^2]。 #### 应用案例分析 考虑到实际应用背景的不同,这里提供两个具体的例子说明三元组的具体用途: - **合并若干三元组以形成目标三元组**:此任务涉及筛选符合条件的一系列源三元组并通过某种策略将其合成为一个最终的目标三元组。该过程可借助贪心算法配合标记数组完成高效查找与更新操作。 - **统计三元组数量**:针对输入序列及其附加参数a,b,c设定约束条件从而计算满足要求的好三元组总数目。此类题目主要考察对绝对差值判断的理解程度以及遍历技巧掌握情况。 综上所述,虽然表面上看似乎只是简单地将三个数值捆绑在一起,但在不同领域内围绕着这一基础概念却能衍生出丰富多彩的功能模块设计思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

伟大的车尔尼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值