开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情
算法题目:LeetCode-1534
给你一个整数数组 arr ,以及 a、b 、c 三个整数。请你统计其中好三元组的数量。
如果三元组 (arr[i], arr[j], arr[k]) 满足下列全部条件,则认为它是一个 好三元组 。
0 <= i < j < k < arr.length|arr[i] - arr[j]| <= a|arr[j] - arr[k]| <= b|arr[i] - arr[k]| <= c
其中 |x| 表示 x 的绝对值。
返回 好三元组的数量 。
示例 1:
输入: arr = [3,0,1,1,9,7], a = 7, b = 2, c = 3
输出: 4
解释: 一共有 4 个好三元组:[(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
输出: 0
解释: 不存在满足所有条件的三元组。
提示:
3 <= arr.length <= 1000 <= arr[i] <= 10000 <= a, b, c <= 1000
解题分析
分析题意这道题目要求统计给定的整数数组 arr 中的好三元组的数量。
需要使用三重循环遍历数组 arr,对于每个三元组,可以确保下标的大小关系满足好三元组的要求,需要 O(1) 的时间判断三个元素的值是否满足好三元组的要求。
一个好三元组对应一个下标的三元组 (i,j,k),三个下标满足题目给定的条件。遍历数组中的每一个三元组,统计好三元组的数量即可。
算法代码
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;
}
代码执行
分析复杂度
- 时间复杂度:
- 空间复杂度:
在掘金(JUEJIN) 一起分享知识, Keep Learning!