方法一:循环嵌套(类似九九乘法表的思路)
假设数组的长度为n,取i,j, k三个变量,遍历数组,输出好数对的数目sum
class Solution {
public:
int countGoodTriplets(vector<int>& arr, int a, int b, int c) {
int sum = 0;// 计算好三元组的数量
int n = arr.size();// 设数组的长度为n
for(int i = 0; i < n; ++i){ // 第一层i的取值0 <=i < n-2
for(int j = i+1; j < n; ++j){
for(int k = j+1; k < n; ++k){
if(i < j < k & abs(arr[i] - arr[j]) <= a && abs(arr[j] - arr[k]) <= b && abs(arr[i] - arr[k]) <= c){
++sum;
}
}
};
}
return sum;
}
};
方法二:题解(独木舟之旅)
sum数组中的每个元素的含义换成arr数组中的值为该元素的数量,例如:sum[3]=2意为arr数组中有2个3。
注意:这里的arr数组的范围仅限于小于j的范围,这一点在代码中有所体现,就不再赘述
这样在求得l和r两个分界点并判断出l<=r后,即可遍历累加l和r范围内(包含边界)所有值的数量,代码如下:
for(int i=l;i<=r;i++)
{
ans+=sum[i];
}
最终ans即为所求
class Solution {
public:
int countGoodTriplets(vector<int>& arr, int a, int b, int c) {
int ans = 0, n = arr.size();
vector<int> sum(1001, 0);
for (int j = 0; j < n; ++j) {
for (int k = j + 1; k < n; ++k) {
if (abs(arr[j] - arr[k]) <= b) {
int lj = arr[j] - a, rj = arr[j] + a;
int lk = arr[k] - c, rk = arr[k] + c;
int l = max(0, max(lj, lk)), r = min(1000, min(rj, rk));
if (l <= r) {
for(int i=l;i<=r;i++)
{
ans+=sum[i];
}
}
}
}
sum[arr[j]]++;
}
return ans;
}
};