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
严格 递增
暴力,寻找,哈希表,三指针,二分查找啥的都能做。最好用的就是哈希表和三指针。
三指针基础思路版:
由于数组递增,可以想到假设y大于x,那么y - diff 大于x - diff,y + diff 大于x + diff。
利用三指针分别指向即可。
class Solution { public int arithmeticTriplets(int[] nums, int diff) { int res = 0; for (int i = 0; i < nums.length; i ++) { // 左边等于nums[i] - diff的元素的数目。 // 右边等于nums[i] + diff的元素的数目。 int res1 = 0; int res2 = 0; int tem1 = nums[i] - diff; int tem2 = nums[i] + diff; // 寻找左边等于tem1的元素的数量。 for (int j = 0; nums[j] <= tem1; j ++) { if (nums[j] == tem1) { res1 ++; } } // 寻找右边等于tem2的元素的数量。 for (int j = i; j < nums.length && nums[j] <= tem2; j ++) { if (nums[j] == tem2) { res2 ++; } } // 两者相乘即是当前元素符合题意的三元组数目。 res += res1 * res2; } return res; } }
哈希表:
class Solution { public int arithmeticTriplets(int[] nums, int diff) { Set<Integer> set = new HashSet<>(); for (int x : nums) { set.add(x); } int res = 0; for (int x : nums) { if (set.contains(x - diff) && set.contains(x + diff)) { res ++; } } return res; } }
三指针:
class Solution {
public int arithmeticTriplets(int[] nums, int diff) {
int res = 0;
int n = nums.length;
for (int i = 0, j = 1, k = 2; i < n - 2 && j < n - 1 && k < n; i++) {
j = Math.max(j, i + 1);
while (j < n - 1 && nums[j] - nums[i] < diff) {
j++;
}
if (j >= n - 1 || nums[j] - nums[i] > diff) {
continue;
}
k = Math.max(k, j + 1);
while (k < n && nums[k] - nums[j] < diff) {
k++;
}
if (k < n && nums[k] - nums[j] == diff) {
res++;
}
}
return res;
}
}