当前位置: 首页 > news >正文

【Leetcode 每日一题 - 补卡】1534. 统计好三元组

问题背景

给你一个整数数组 a r r arr arr,以及 a 、 b 、 c a、b 、c abc 三个整数。请你统计其中好三元组的数量。
如果三元组 ( a r r [ i ] , a r r [ j ] , a r r [ k ] ) (arr[i], arr[j], arr[k]) (arr[i],arr[j],arr[k]) 满足下列全部条件,则认为它是一个 好三元组

  • 0 ≤ i < j < k < a r r . l e n g t h 0 \le i < j < k < arr.length 0i<j<k<arr.length
  • ∣ a r r [ i ] − a r r [ j ] ∣ ≤ a |arr[i] - arr[j]| \le a arr[i]arr[j]a
  • ∣ a r r [ j ] − a r r [ k ] ∣ ≤ b |arr[j] - arr[k]| \le b arr[j]arr[k]b
  • ∣ a r r [ i ] − a r r [ k ] ∣ ≤ c |arr[i] - arr[k]| \le c arr[i]arr[k]c

其中 ∣ x ∣ |x| x 表示 x x x 的绝对值。
返回 好三元组的数量

数据约束

  • 3 ≤ a r r . l e n g t h ≤ 100 3 \le arr.length \le 100 3arr.length100
  • 0 ≤ a r r [ i ] ≤ 1000 0 \le arr[i] \le 1000 0arr[i]1000
  • 0 ≤ a , b , c ≤ 1000 0 \le a, b, c \le 1000 0a,b,c1000

解题过程

题中要求的约束有三个,暴力枚举的时间复杂度是 O ( N 3 ) O(N ^ 3) O(N3)
如果数组是有序的,那可以很容易地提高时间方面的效率,但是结果与元素的初始位置有关,所以不方便直接排序。
退而求其次,定义一个下标数组,对它进行排序。
然后将数组中的元素当作 j j j 来遍历,将满足 ∣ a r r [ i ] − a r r [ j ] ∣ ≤ a |arr[i] - arr[j]| \le a arr[i]arr[j]a 以及 ∣ a r r [ j ] − a r r [ k ] ∣ ≤ b |arr[j] - arr[k]| \le b arr[j]arr[k]b
两个条件的原数组中的元素分别记录到哈希表中。
接下来只要再求满足第三个条件的元素对的数量,根据绝对值的定义,可以在线性的时间内得到合法结果的上下限。

具体实现

class Solution {public int countGoodTriplets(int[] arr, int a, int b, int c) {Integer[] idx = new Integer[arr.length];Arrays.setAll(idx, i -> i);Arrays.sort(idx, (i, j) -> arr[i] - arr[j]);int res = 0;for (int j : idx) {int cur = arr[j];List<Integer> list1 = new ArrayList<>();for (int i : idx) {if (i < j && Math.abs(arr[i] - cur) <= a) {list1.add(arr[i]);}}List<Integer> list2 = new ArrayList<>();for (int k : idx) {if (k > j && Math.abs(arr[k] - cur) <= b) {list2.add(arr[k]);}}int left = 0;int right = 0;for (int item : list1) {while (right < list2.size() && list2.get(right) <= item + c) {right++;}while (left < list2.size() && list2.get(left) < item - c) {left++;}res += right - left;}}return res;}
}

相关文章:

  • HBuilder安装PHP开发插件教程
  • 浔川AI翻译v7.0更新预告
  • 深度解析Spring @Scheduled:从基础使用到高级定制
  • Java反射知识点学习笔记
  • VS Code 安装及常用插件
  • 【计算机视觉】OpenCV实战项目-AdvancedLaneDetection 车道检测
  • NLP高频面试题(四十六)——Transformer 架构中的位置编码及其演化详解
  • RPCRT4!OSF_CCALL::ActivateCall函数分析之RPCRT4!OSF_CCALL结构中的Bindings--RPC源代码分析
  • 2025中国移动云智算大会回顾:云智变革,AI+跃迁
  • PHP开发环境搭建(Hbuider+phpstudy)
  • 数据通信学习笔记之OSPF配置命令
  • 知识图谱中医知识问答系统|养生医案综合可视化系|推荐算法|vue+flask+neo4j+mysql
  • MATLAB 程序实现了一个层次化光网络的数据传输模拟系统
  • 【Linux基础】sqlite数据库
  • 观察者模式与发布订阅模式:解耦与通信的艺术
  • SpringBoot 动态加载 Jar 包
  • 【c语言】深入理解指针2
  • Python 获取淘宝券后价接口的详细指南
  • 2025年机动车检测站授权签字人考试真题及答案
  • 【C++】map和set
  • 证监会:坚决拥护党中央对王建军进行纪律审查和监察调查的决定
  • 共绘“彩色上海”,IP SH艺术共创沙龙首期圆满举办
  • 滨江集团:一季度营收225.07亿元,净利润9.75亿元
  • 中方拟解除对5名欧洲议会议员制裁?外交部:望中欧立法机构相向而行
  • 新型算法助力听障人士听得更清晰
  • 白云山一季度营收净利双降,此前称今年将挖掘盘活自身资源