LeetCode[剑指Offer51]数组中的逆序对

难度:Hard

题目:

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。


示例 1:

复制代码
输入: [7,5,6,4]
输出: 5

限制:

0 <= 数组长度 <= 50000

Related Topics

  • 树状数组
  • 线段树
  • 数组
  • 二分查找
  • 分治
  • 有序集合
  • 归并排序

重点!!!解题思路

第一步:

明确解题手段:本章节主要练习归并排序所以本题使用归并排序来解决

第二步:

明确归并排序过程:

首先进行递归,然后进行合并,重复此步骤,即可完成归并排序

(1)但是本题要求求出逆序对,归并的过程就是分开再合并,当合并时左右两边都是升序

(2)如果右边第一个值小于左边第一个值,即代表右边第一个值和左边所有值都可以组成 逆序对

如果这里明白了 那么此题就可以解决了

源码+讲解:

java 复制代码
    class Solution {
        int[] temp; //临时数组

        public int reversePairs(int[] nums) {
            if (nums.length < 2) return 0;
            temp = new int[nums.length];  //临时数组必须大于等于原数组大小  用于拷贝
            return merge_sort(nums, 0, nums.length - 1);  //归并范围
        }

        public int merge_sort(int[] nums, int l, int r) {
            if (l >= r) return 0;  //终止条件 剩一个元素时不进行分组了
            int mid = (l + r) >> 1, ans = 0;  //求一个中间值mid,ans用于统计逆序对
            ans += merge_sort(nums, l, mid);  //递归分组
            ans += merge_sort(nums, mid + 1, r);  //递归分组
            int p1 = l, p2 = mid + 1, k = l;  //p1代表分组后左边的第一个值得下标,p2代表右边第一个值得下标,k代表临时数组得下标
            while (p1 <= mid || p2 <= r) {  //合并
                if (p2 > r || (p1 <= mid && nums[p1] <= nums[p2])) {  //右面没有值了或者左面还有值并且左面p1的值小于右面p2的值时,将p1位置的值放入临时数组
                    temp[k++] = nums[p1++];
                } else {  //同上
                    temp[k++] = nums[p2++];
                    ans += mid - p1 + 1;  //当p2的值小于p1的时候,那么此时左面剩下的所有值都能和此时p2的值构成逆序对
                }
            }
            for (int i = l; i <= r; i++) nums[i] = temp[i]; //将临时数组拷贝回原数组,以便递归排序
            return ans;  
        }
    }

运行结果:

系列持续更新中,喜欢练习算法的那就点个攒吧

相关推荐
朝新_9 分钟前
【优选算法】第一弹——双指针(上)
算法
艾莉丝努力练剑31 分钟前
【C++STL :stack && queue (一) 】STL:stack与queue全解析|深入使用(附高频算法题详解)
linux·开发语言·数据结构·c++·算法
CoovallyAIHub1 小时前
ICLR 2026 惊现 SAM 3,匿名提交,实现“概念分割”,CV领域再迎颠覆性突破?
深度学习·算法·计算机视觉
IT古董1 小时前
【第五章:计算机视觉-计算机视觉在工业制造领域中的应用】1.工业缺陷分割-(2)BiseNet系列算法详解
算法·计算机视觉·制造
电鱼智能的电小鱼1 小时前
服装制造企业痛点解决方案:EFISH-SBC-RK3588 预测性维护方案
网络·人工智能·嵌入式硬件·算法·制造
yan8626592461 小时前
于 C++ 的虚函数多态 和 模板方法模式 的结合
java·开发语言·算法
小此方1 小时前
C语言自定义变量类型结构体理论:从初见到精通(下)
c语言·数据结构·算法
_poplar_2 小时前
15 【C++11 新特性】统一的列表初始化和变量类型推导
开发语言·数据结构·c++·git·算法
CoovallyAIHub2 小时前
YOLO Vision 2025 还没结束!亚洲首场登陆深圳,YOLO26有望亮相
深度学习·算法·计算机视觉
寂静山林2 小时前
UVa 10447 Sum-up the Primes (II)
算法