2367. 算术三元组的数目

把握现在,决战今天。

LC每日一题,参考2367. 算术三元组的数目,难度分1203。

题目

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

  • i < j < k ,nums[j] - nums[i] == diff 且nums[k] - nums[j] == diff

返回不同 算术三元组 的数目。

解题思路

  • 哈希:遍历一个三元组元素使用哈希查找其他两个元素。
  • 三指针:由于nums严格递增,遍历i时,jk不会回退,效率大大提高。

哈希表 1ms

遍历枚举k找i,j

class Solution {
    public int arithmeticTriplets(int[] nums, int diff) {
        int ans = 0;
        HashSet hs = new HashSet<>();
        for (int num: nums) {
            hs.add(num);
            if(num>=diff*2 && hs.contains(num-diff) && hs.contains(num-diff*2)) ans++;
        }
        return ans;
    }
}

数组哈希 0ms

class Solution {
    public int arithmeticTriplets(int[] nums, int diff) {
        //由于0 <= nums[i] <= 200 所以可用数组哈希
        int ans = 0;
        boolean[] hash = new boolean[nums[nums.length - 1] + 1];//new boolean[201];
        for (int num: nums) {
            hash[num] = true;
            if(num >= diff * 2 && hash[num - diff] && hash[num - diff*2]) ans++;
        }
        return ans;
    }
}

复杂度分析

  • 时间复杂度:O(n),遍历n次。
  • 空间复杂度:O(n),使用大小为n的空间。

三指针 0ms

class Solution {
    public int arithmeticTriplets(int[] nums, int diff) {
        int ans = 0;
        int n = nums.length;
        for (int i = 0, j = 1, k = 2; i < n - 2; i++) {
            while(j < n - 2 && nums[i] + diff > nums[j]) j++;
            while(k < n -1 && nums[i] + diff * 2 > nums[k]) k++;
            if(nums[i] + diff == nums[j] && nums[i] + diff * 2 == nums[k]) ans ++;
        }
        return ans;
    }
}

复杂度分析

  • 时间复杂度:O(n),遍历n次。
  • 空间复杂度:O(1),使用常量个变量空间。

2023-03-31

你可能感兴趣的:(2367. 算术三元组的数目)