计算机创新协会冬令营——暴力枚举题目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;
    }
}

暴力的结果就是  足够慢!!!

计算机创新协会冬令营——暴力枚举题目02_第1张图片


Java题解二:哈希表

这里就是通过哈希表快速查找属于很简单但是很经典的哈希表应用。

class Solution {
    public static int arithmeticTriplets(int[] nums, int diff) {
        // 定义出哈希表,这里用set集合
        Set 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& nums, int diff) {
        // 定义哈希表,使用unordered_set
        std::unordered_set 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;
    }
};

 

总结

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

你可能感兴趣的:(我的算法记录,算法,java,c++)