leetcode困难2179统计数组中好三元组数目

Posted qq_40707462

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode困难2179统计数组中好三元组数目相关的知识,希望对你有一定的参考价值。

给你两个下标从 0 开始且长度为 n 的整数数组 nums1 和 nums2 ,两者都是 [0, 1, …, n - 1] 的 排列 。

好三元组 指的是 3 个 互不相同 的值,且它们在数组 nums1 和 nums2 中出现顺序保持一致。换句话说,如果我们将 pos1v 记为值 v 在 nums1 中出现的位置,pos2v 为值 v 在 nums2 中的位置,那么一个好三元组定义为 0 <= x, y, z <= n - 1 ,且 pos1x < pos1y < pos1zpos2x < pos2y < pos2z 都成立的 (x, y, z) 。

请你返回好三元组的 总数目 。3 <= n <= 100000

示例 1:

输入:nums1 = [2,0,1,3], nums2 = [0,1,2,3]
输出:1
解释:
总共有 4 个三元组 (x,y,z) 满足 pos1x < pos1y < pos1z ,
分别是 (2,0,1)(2,0,3)(2,1,3)(0,1,3) 。
这些三元组中,只有 (0,1,3) 满足 pos2x < pos2y < pos2z 。
所以只有 1 个好三元组。

示例 2:

输入:nums1 = [4,0,1,3,2], nums2 = [4,1,0,2,3]
输出:4
解释:总共有 4 个好三元组 (4,0,3)(4,0,2)(4,1,3)(4,1,2)

思路:

nums1:[4,0,1,3,2] -> [0,1,2,3,4] 记录nums1中数字的位置(或者说映射关系)
nums2:[4,1,0,2,3] -> [0,2,1,4,3] 让nums2按照这个顺序排列
nums2左边小于当前数,有几对[0,1,1,3,3]
nums2右边大于当前数,有几对[4,2,2,0,0]
ans = sum(left[i] * right[i]);

注意:树状数组的下标是 1 … n,而给定的数组下标是 0 … n-1

class Solution 
    public long goodTriplets(int[] nums1, int[] nums2) 
        int n=nums1.length;
        long res=0;
        Map<Integer, Integer> hash = new HashMap<>();
        for (int i = 0; i < n; i++) hash.put(nums1[i], i);
        for (int i = 0; i < n; i++) nums2[i] = hash.get(nums2[i]);
        BIT bit=new BIT(100005);
        for(int i=0;i<n;i++)           
            int l = bit.query(nums2[i]+1); // 左边小于nums2[i]的数
            int t = i - l; // 左边大于nums2[i]的数
            int r = (n - nums2[i] - 1) - t; // 右边大于nums2[i]的数
            bit.update(nums2[i]+1); 
            res += 1L * l * r;
        
        return res;
    


class BIT 
    private int[] tree;
    private int n;

    public BIT(int n) 
        this.n = n;
        this.tree = new int[n + 1];
    

    public static int lowbit(int x) 
        return x & (-x);
    

    public int query(int x) 
        int ret = 0;
        while (x != 0) 
            ret += tree[x];
            x -= lowbit(x);
        
        return ret;
    

    public void update(int x) 
        while (x <= n) 
            ++tree[x];
            x += lowbit(x);
        
    


以上是关于leetcode困难2179统计数组中好三元组数目的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-11:1814. 统计一个数组中好对子的数目

leetcode-11:1814. 统计一个数组中好对子的数目

leetcode-11:1814. 统计一个数组中好对子的数目

LeetCode Algorithm 1925. 统计平方和三元组的数目

LeetCode 1442 形成两个异或相等数组的三元组数目[异或 位运算 数学] HERODING的LeetCode之路

leetcode-26双周赛-5398-统计二叉树中好结点的数目