ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

计算机创新协会冬令营——暴力枚举题目02

2026/9/25 10:51:44 拓冰建站 浏览量
计算机创新协会冬令营——暴力枚举题目02

再次欢迎大家参加此次的冬令营,我们协会欢迎所有志同道合的同学们。话不多说,先来看看今天的题目吧。♪(^∇^*)

题目

力扣题号: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;}
};

 

总结

这两道题就是这样大家加油