首页 > 其他分享 >树状数组-归并排序-逆序对-2426. 满足不等式的数对数目

树状数组-归并排序-逆序对-2426. 满足不等式的数对数目

时间:2022-10-05 20:33:22浏览次数:57  
标签:归并 数对 nums 树状 2426 排序 nums1 nums2 逆序

问题描述

给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,两个数组的大小都为 n ,同时给你一个整数 diff ,统计满足以下条件的 数对 (i, j) :

0 <= i < j <= n - 1 且
nums1[i] - nums1[j] <= nums2[i] - nums2[j] + diff.
请你返回满足条件的 数对数目 。

示例 1:
输入:nums1 = [3,2,5], nums2 = [2,2,1], diff = 1
输出:3
解释:
总共有 3 个满足条件的数对:

  1. i = 0, j = 1:3 - 2 <= 2 - 2 + 1 。因为 i < j 且 1 <= 1 ,这个数对满足条件。
  2. i = 0, j = 2:3 - 5 <= 2 - 1 + 1 。因为 i < j 且 -2 <= 2 ,这个数对满足条件。
  3. i = 1, j = 2:2 - 5 <= 2 - 1 + 1 。因为 i < j 且 -3 <= 2 ,这个数对满足条件。
    所以,我们返回 3 。

示例 2:
输入:nums1 = [3,-1], nums2 = [-2,2], diff = -1
输出:0
解释:
没有满足条件的任何数对,所以我们返回 0 。
 
提示:
n == nums1.length == nums2.length
2 <= n <= 105
-104 <= nums1[i], nums2[i] <= 104
-104 <= diff <= 104

问题求解

首先对问题做一下转化,等价于求解nums[i] <= nums[j] + diff的个数。

  • 归并排序
    归并排序是求解逆序对问题的经典解法,优点是容易思考,编码也相对容易,且对数据大小没有限制,需要优先掌握。
class Solution:
    # nums[i] <= nums[j] + diff
    def numberOfPairs(self, nums1: List[int], nums2: List[int], diff: int) -> int:
        n = len(nums1)
        nums = [nums1[i] - nums2[i] for i in range(n)]

        def merge_sort(nums):
            if len(nums) <= 1:
                return 0
            res = 0
            mid = len(nums) // 2
            l, r = nums[:mid], nums[mid:]
            res += merge_sort(l)
            res += merge_sort(r)

            i, n, m = 0, len(l), len(r)
            for x in r:
                while i < n and l[i] <= x + diff: i += 1
                res += i
            
            i, j, k = 0, 0, 0
            while i < n and j < m:
                if l[i] <= r[j]:
                    nums[k] = l[i]
                    i += 1
                else:
                    nums[k] = r[j]
                    j += 1
                k += 1
            while i < n:
                nums[k] = l[i]
                i += 1
                k += 1
            while j < m:
                nums[k] = r[j]
                j += 1
                k += 1
            return res
        
        return merge_sort(nums)

标签:归并,数对,nums,树状,2426,排序,nums1,nums2,逆序
From: https://www.cnblogs.com/hyserendipity/p/16756287.html

相关文章

  • 树状控件的应用(选择出阵武将)
    树状控件的应用                         何志丹下面是树状控件的一些应用,由于是由于用于演示,所以结构并不合理.其效果如图所示..步骤如下:1,......
  • 01背包&完全背包二维写法的对比,进而理解一维优化后的正逆序
    01背包题解完全背包题解二维写法时两种背包问题核心代码的区别:可以看出,01背包用的是上一层的数据,完全背包用的是当前层的数据所以优化为一维时,01背包需逆序for......
  • 计算五位数的逆序数
    #include<stdio.h>intmain(){longa;//输入一位五位数 intg,h,m,k,l;//依次获取各位数值 intn; //inti,j;//迭代值 intt=0;//逆序数 //intb;*/ printf("计......
  • 树状数组+dfs
    P3605[USACO17JAN]PromotionCountingP-洛谷|计算机科学教育新生态(luogu.com.cn)这是一棵树,首先想到了dfs,但是数据范围大,所以不能单纯用dfs想到每个结点只跟他的......
  • 用递归函数和栈操作逆序栈
    用递归函数和栈操作逆序栈作者:Grey原文地址:博客园:用递归函数和栈操作逆序栈CSDN:用递归函数和栈操作逆序栈题目描述请设计一个算法实现逆序栈的操作,但是只能用递归函......
  • 整数的逆序
    思路:首先定义三个变量abc,让用户输入一个整数存放在变量a中     然后让a对10取余数得到其个位数,将这个个位数赋值给b     每次的a/10使得a每次丢到其各......
  • P4062 Yazid的新生舞会(树状数组)
    Yazid的新生舞会题目描述Yazid有一个长度为\(n\)的序列\(A\),下标从\(1\)至\(n\)。显然地,这个序列共有\(\frac{n\left(n+1\right)}{2}\)个子区间。对于任意一......
  • 通过策略模式实现树状结构的自动生成
    1.树处理器publicabstractclassAbstractTreeHandlerimplementsInitializingBean{@ResourceprivateTreeHandlerContexttreeContext;@Override......
  • Fenwick 树状数组上二分
    其实应该叫倍增。由于这篇文章中\(\text{lowbit}\)Acwing244.谜一样的牛给定一个长度\(n\le10^5\)序列,求逆康托。\(0\lea_i<i\)若是\(\logn\)二分,再\(\lo......
  • 2021杭电多校1 J (普通莫队 树状数组)
    题意:给出1e5个二维平面上的坐标点0<=(x,y)<=1e5,1e5个询问,每次问x0,y0到x1,y1的矩阵中有多少y值不同的坐标点。思路:操作只有询问,不强制在线,数据范围1e5,就差把莫......