LeetCode——2367. 算术三元组的数目

一、题目

给你一个下标从 0 开始、严格递增 的整数数组 nums 和一个正整数 diff 。如果满足下述全部条件,则三元组 (i, j, k) 就是一个 算术三元组 :

i < j < k ,
nums[j] - nums[i] = diff 且
nums[k] - nums[j] = diff
返回不同 算术三元组 的数目。
LeetCode——2367. 算术三元组的数目_第1张图片
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/number-of-arithmetic-triplets/description/

二、C++解法

我的思路及代码

由于数组是严格单调递增的,假设当前数组的第 i 位可以组成三元组,那么其他两位数的位置必然在 i+diff 和 i+2*diff 之前。于是按照这个思路就可以很快的写出代码了。和暴力遍历一样,也是三层循环,但不一样的是,里面的两层循环最多只需要执行 diff 次就可以得到答案了。这样写的好处在于如果数组比较密集的话,目标三元组数会比较靠后,从后往前寻找目标会比较快速,普通的遍历方法是从前往后找,各有各的好处。

class Solution {
public:
    int arithmeticTriplets(vector<int>& nums, int diff) {
        int ans = 0;
        for(int i=0;i<nums.size();i++){
            for(int j=i+diff>=nums.size()?nums.size()-1:i+diff;j>i;j--){
                if(nums[j]-nums[i] == diff){     
                    for(int k=j+diff>=nums.size()?nums.size()-1:j+diff;k>j;k--)
                        if(nums[k]-nums[j] == diff)
                            ans++;
                }
            }
        }
        return ans;
    }
};
  • 时间复杂度:O(n+2*diff),其中 n 是数组 nums 的长度
  • 空间复杂度:O(1)

官方参考代码

LeetCode——2367. 算术三元组的数目_第2张图片

class Solution {
public:
    int arithmeticTriplets(vector<int>& nums, int diff) {
        unordered_set<int> hashSet;
        for (int x : nums) {
            hashSet.emplace(x);
        }
        int ans = 0;
        for (int x : nums) {
            if (hashSet.count(x + diff) && hashSet.count(x + 2 * diff)) {
                ans++;
            }
        }
        return ans;
    }
};
  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。需要遍历数组两次,每次将元素加入哈希集合与判断元素是否在哈希集合中的时间都是 O(1)
  • 空间复杂度:O(n),其中 n 是数组 nums 的长度。哈希集合需要 O(n) 的空间

你可能感兴趣的:(力扣,leetcode,算法)