再次欢迎大家参加此次的冬令营,我们协会欢迎所有志同道合的同学们。话不多说,先来看看今天的题目吧。?(^?^*)
注:下述题目和示例均来自力扣
给你一个下标从?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 。示例 2:
输入:nums = [4,5,6,7,8,9], diff = 2 输出:2 解释: (0, 2, 4) 是算术三元组:8 - 6 == 2 且 6 - 4 == 2 。 (1, 3, 5) 是算术三元组:9 - 7 == 2 且 7 - 5 == 2 。
3 <= nums.length <= 200
0 <= nums[i] <= 200
1 <= diff <= 50
nums
?严格?递增
这个传说中的算术三元组也就是连续三个数的差值==diff罢了,诶,不用连续。这个题目理解了就简单了
直接三重循环,挨个找数即可
class Solution {
public int arithmeticTriplets(int[] nums, int diff) {
// 计算长度
int len = nums.length;
// 定义结果
int res = 0;
// 开始三重循环,每一层代表一个数,挨个遍历寻找
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
for (int k = 0; k < len; k++) {
if (nums[j] - nums[i] == diff && nums[k] - nums[j] == diff){
// 由于已经是递增的数组,所以不用判断i < j < k
// 满足条件res加一
res++;
}
}
}
}
return res;
}
}
暴力的结果就是? 足够慢!!!
这里就是通过哈希表快速查找属于很简单但是很经典的哈希表应用。
class Solution {
public static int arithmeticTriplets(int[] nums, int diff) {
// 定义出哈希表,这里用set集合
Set<Integer> set = new HashSet<>();
// 先全部存入set集合
for (int num : nums) {
set.add(num);
}
// 定义返回值
int res = 0;
// 挨个寻找最终结果
for (int num : nums) {
// 算术三元组 符合条件
if (set.contains(num + diff) && set.contains(num + 2 * diff)) {
// 符合结果加一
res++;
}
}
return res;
}
}
这里我只提供第二中方法的其他语言,暴力的代码应该都看得懂
class Solution {
public:
int arithmeticTriplets(vector<int>& nums, int diff) {
// 定义哈希表,使用unordered_set
std::unordered_set<int> set;
// 将所有元素存入unordered_set
for (int num : nums) {
set.insert(num);
}
// 定义返回值
int res = 0;
// 逐个查找最终结果
for (int num : nums) {
// 判断是否存在等差数列
if (set.count(num + diff) && set.count(num + 2 * diff)) {
// 符合条件的结果加一
res++;
}
}
return res;
}
};
?
这两道题就是这样大家加油