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

打印 上一主题 下一主题

主题 1793|帖子 1793|积分 5379

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题背景

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


  •                                         0                            ≤                            i                            <                            j                            <                            k                            <                            a                            r                            r                            .                            l                            e                            n                            g                            t                            h                                  0 \le i < j < k < arr.length                     0≤i<j<k<arr.length
  •                                         ∣                            a                            r                            r                            [                            i                            ]                            −                            a                            r                            r                            [                            j                            ]                            ∣                            ≤                            a                                  |arr - arr[j]| \le a                     ∣arr−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 - arr[k]| \le c                     ∣arr−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                     3≤arr.length≤100
  •                                         0                            ≤                            a                            r                            r                            [                            i                            ]                            ≤                            1000                                  0 \le arr \le 1000                     0≤arr≤1000
  •                                         0                            ≤                            a                            ,                            b                            ,                            c                            ≤                            1000                                  0 \le a, b, c \le 1000                     0≤a,b,c≤1000
解题过程

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

  1. class Solution {
  2.     public int countGoodTriplets(int[] arr, int a, int b, int c) {
  3.         Integer[] idx = new Integer[arr.length];
  4.         Arrays.setAll(idx, i -> i);
  5.         Arrays.sort(idx, (i, j) -> arr[i] - arr[j]);
  6.         int res = 0;
  7.         for (int j : idx) {
  8.             int cur = arr[j];
  9.             List<Integer> list1 = new ArrayList<>();
  10.             for (int i : idx) {
  11.                 if (i < j && Math.abs(arr[i] - cur) <= a) {
  12.                     list1.add(arr[i]);
  13.                 }
  14.             }
  15.             List<Integer> list2 = new ArrayList<>();
  16.             for (int k : idx) {
  17.                 if (k > j && Math.abs(arr[k] - cur) <= b) {
  18.                     list2.add(arr[k]);
  19.                 }
  20.             }
  21.             int left = 0;
  22.             int right = 0;
  23.             for (int item : list1) {
  24.                 while (right < list2.size() && list2.get(right) <= item + c) {
  25.                     right++;
  26.                 }
  27.                 while (left < list2.size() && list2.get(left) < item - c) {
  28.                     left++;
  29.                 }
  30.                 res += right - left;
  31.             }
  32.         }
  33.         return res;
  34.     }
  35. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表