【每日一题Day163】LC2367算术三元组的数目 | 二分查找 哈希表

算术三元组的数目【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]+2diff,然后通过二分查找数组中是否存在这两个元素,如果都存在,那么结果加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]2diff,然后通过哈希表存储已经遍历过的元素,然后判断数组中是否存在这两个元素,如果都存在,那么结果加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;
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值