【算法训练】LeetCode#1534 统计好三元组

一、描述

1534. 统计好三元组

给你一个整数数组 arr ,以及 abc 三个整数。请你统计其中好三元组的数量。

如果三元组 (arr[i], arr[j], arr[k]) 满足下列全部条件,则认为它是一个 好三元组

  • 0 <= i < j < k < arr.length
  • |arr[i] - arr[j]| <= a
  • |arr[j] - arr[k]| <= b
  • |arr[i] - arr[k]| <= c

其中 |x| 表示 x 的绝对值。

返回 好三元组的数量

示例 1:

输入:arr = [3,0,1,1,9,7], a = 7, b = 2, c = 3
输出:4
解释:一共有 4 个好三元组:[(3,0,1), (3,0,1), (3,1,1), (0,1,1)] 。

示例 2:

输入:arr = [1,1,2,2,3], a = 0, b = 0, c = 1
输出:0
解释:不存在满足所有条件的三元组。

二、思路

时间复杂度为n方的遍历肯定可以,想一想其他的方法。

比如说在遍历过程中主动跳出不满足前两个条件的循环。

三、解题

Java

class Solution {
    public static int numIdenticalPairs(int[] nums) {

        HashMap<Integer, List<Integer>> map = new HashMap<>();
        for (int num : nums) {
            List<Integer> cur = Arrays.asList(0, 0);
            if (map.containsKey(num)){
                // 存在
                cur = map.get(num);
                cur.set(0, cur.get(0) + 1);
                cur.set(1, cur.get(1) + cur.get(0));
            }
            map.put(num,cur);
        }
        int ans = 0;
        for (Map.Entry<Integer, List<Integer>> entity : map.entrySet()){
            ans += entity.getValue().get(1);
        }
        return ans;
    }
}

C++

class Solution {
    public:
        int countGoodTriplets(vector<int>& arr, int a, int b, int c) {
            int ans = 0 ;
            for (int i = 0; i < arr.size()-2; ++i) {
                for (int j = i+1; j < arr.size()-1; ++j) {
                    if (abs(arr[i] - arr[j]) > a){
                        continue;
                    }
                    for (int k = j+1; k < arr.size(); ++k) {
                        if (abs(arr[k] - arr[j]) > b || abs(arr[i] - arr[k]) > c){
                            continue;
                        }
                        ans++;
                    }
                }
            }
            return ans;
        }

};
posted @ 2023-06-26 21:14  小拳头呀  阅读(60)  评论(0编辑  收藏  举报