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

文章介绍了如何解决力扣上的一个问题,即给定一个严格递增的整数数组和一个差值diff,找到满足条件的算术三元组(i,j,k)的数量,其中i<j<k且nums[j]-nums[i]=diff和nums[k]-nums[j]=diff。提供了两种C++解法,一种是基于双指针的优化遍历,另一种是利用哈希集合来减少时间复杂度到O(n)。这两种方法分别分析了其时间复杂度和空间复杂度。
摘要由CSDN通过智能技术生成

一、题目

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

i < j < k ,
nums[j] - nums[i] = diff 且
nums[k] - nums[j] = diff
返回不同 算术三元组 的数目。
在这里插入图片描述
来源:力扣(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)

官方参考代码

在这里插入图片描述

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) 的空间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天地神仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值