算术三元组的数目【LC2367】
给你一个下标从 0 开始、严格递增 的整数数组
nums和一个正整数diff。如果满足下述全部条件,则三元组(i, j, k)就是一个 算术三元组 :
i < j < k,nums[j] - nums[i] == diff且nums[k] - nums[j] == diff返回不同 算术三元组 的数目*。*
枚举+二分查找
-
思路:枚举+二分查找
枚举三元组的每一个iii,那么剩下两个元素值为nums[i]+diffnums[i]+diffnums[i]+diff和nums[i]+2∗diffnums[i]+2*diffnums[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(nlogn)O(nlogn)O(nlogn)
- 空间复杂度:O(1)O(1)O(1)
- 复杂度
哈希表+一次遍历
-
思路:哈希表+一次遍历
枚举三元组的每一个jjj,那么剩下两个元素值为nums[j]−diffnums[j]-diffnums[j]−diff和nums[j]−2∗diffnums[j]-2*diffnums[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; } }

文章介绍了如何在给定数组和差值条件下计算算术三元组的数量。提供了两种解决方案:一种是使用枚举结合二分查找,时间复杂度为O(nlogn),空间复杂度为O(1);另一种是利用哈希表进行一次遍历,同样达到O(n)的时间复杂度,但额外空间需求增大。
6968

被折叠的 条评论
为什么被折叠?



