算术三元组的数目【LC2367】
给你一个下标从 0 开始、严格递增 的整数数组
nums
和一个正整数diff
。如果满足下述全部条件,则三元组(i, j, k)
就是一个 算术三元组 :
i < j < k
,nums[j] - nums[i] == diff
且nums[k] - nums[j] == diff
返回不同 算术三元组 的数目*。*
枚举+二分查找
-
思路:枚举+二分查找
枚举三元组的每一个 i i i,那么剩下两个元素值为 n u m s [ i ] + d i f f nums[i]+diff nums[i]+diff和 n u m s [ i ] + 2 ∗ d i f f nums[i]+2*diff nums[i]+2∗diff,然后通过二分查找数组中是否存在这两个元素,如果都存在,那么结果加1
-
实现
class Solution { public int arithmeticTriplets(int[] nums, int diff) { int res = 0; for (int i = 0; i < nums.length; i++){ if (binarySearch(nums, nums[i] + diff) != -1 && binarySearch(nums, nums[i] + 2 * diff) != -1){ res++; } } return res; } public int binarySearch(int[] nums, int target){ int l = 0, r = nums.length - 1; while (l <= r){ int mid = (l + r) >> 1; if (nums[mid] == target){ return mid; }else if (nums[mid] > target){ r = mid - 1; }else{ l = mid + 1; } } return -1; } }
- 复杂度
- 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
- 空间复杂度: O ( 1 ) O(1) O(1)
- 复杂度
哈希表+一次遍历
-
思路:哈希表+一次遍历
枚举三元组的每一个 j j j,那么剩下两个元素值为 n u m s [ j ] − d i f f nums[j]-diff nums[j]−diff和 n u m s [ j ] − 2 ∗ d i f f nums[j]-2*diff nums[j]−2∗diff,然后通过哈希表存储已经遍历过的元素,然后判断数组中是否存在这两个元素,如果都存在,那么结果加1
-
实现
class Solution { public int arithmeticTriplets(int[] nums, int diff) { Set<Integer> set = new HashSet<>(); int res = 0; for (int i = 0; i < nums.length; i++){ if (set.contains(nums[i] - diff) && set.contains(nums[i] - 2 * diff)){ res++; } set.add(nums[i]); } return res; } }