再次欢迎大家参加此次的冬令营,我们协会欢迎所有志同道合的同学们。话不多说,先来看看今天的题目吧。♪(^∇^*)
题目
力扣题号:2367. 算术三元组的数目
注:下述题目和示例均来自力扣
题目
给你一个下标从 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罢了,诶,不用连续。这个题目理解了就简单了
Java题解一:直接暴力
直接三重循环,挨个找数即可
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;}
}
暴力的结果就是 足够慢!!!
Java题解二:哈希表
这里就是通过哈希表快速查找属于很简单但是很经典的哈希表应用。
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;}
}
其他语言解法
这里我只提供第二中方法的其他语言,暴力的代码应该都看得懂
C++
class Solution {
public:int arithmeticTriplets(vector<int>& nums, int diff) {// 定义哈希表,使用unordered_setstd::unordered_set<int> set;// 将所有元素存入unordered_setfor (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;}
};
总结
这两道题就是这样大家加油