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

发布时间:2024年01月03日

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

题目

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

?

总结

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

文章来源:https://blog.csdn.net/DDDDWJDDDD/article/details/135370605
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。