题目:
给你一个下标从 0 开始、严格递增 的整数数组 nums 和一个正整数 diff 。如果满足下述全部条件,则三元组 (i, j, k) 就是一个 算术三元组 :
i < j < k ,
nums[j] - nums[i] == diff 且
nums[k] - nums[j] == diff
返回不同 算术三元组 的数目。
示例 1:
输入:nums = [0,1,4,6,7,10], diff = 3
输出:2
解释:
(1, 2, 4) 是算术三元组:7 - 4 == 3 且 4 - 1 == 3 。
(2, 4, 5) 是算术三元组:10 - 7 == 3 且 7 - 4 == 3 。
思路:
1.无脑暴力遍历
2.哈希表
语法知识:
- unordered_set s{nums.begin(), nums.end()} 创建一个无序集合(unordered_set)对象s,并将一个整数数组nums中的元素作为初始化参数传递给s。这样做的效果是将nums中的元素添加到s中,而且s中不会包含重复的元素。
- s.count(x - diff) 具体来说,count()函数接受一个参数,即要查找的元素。它会返回一个整数值,表示该元素在集合中的出现次数。如果该元素存在于集合中,则返回1;如果不存在,则返回0。
count()函数可以用来判断集合中是否存在某个元素,或者统计某个元素在集合中出现的次数。
代码:
//法一:暴力循环
class Solution {
public:
int arithmeticTriplets(vector<int>& nums, int diff) {
int num=0;
for(int i=0;i<nums.size();i++)
{
for(int j=1;j<nums.size();j++)
{
if(nums[j]-nums[i]==diff)
{
for(int k=j+1;k<nums.size();k++)
{
if(nums[k]-nums[j]==diff)
num++;
}
}
}
}
return num;
}
};
//法二:哈希表
class Solution {
public:
int arithmeticTriplets(vector<int> &nums, int diff) {
int ans = 0;
unordered_set<int> s{nums.begin(), nums.end()};
for (int x: nums)
if (s.count(x - diff) && s.count(x + diff))
++ans;
return ans;
}
};