首页 > 其他分享 >剑指 Offer 51. 数组中的逆序对(困难)

剑指 Offer 51. 数组中的逆序对(困难)

时间:2023-08-22 21:47:15浏览次数:32  
标签:tmp mergesort Offer int nums 51 逆序

题目:

class Solution {      //这道题利用了归并排序(分而治之)的思想,就是在每一次排序中统计逆序对的个数
public:
    int mergesort(int l, int r, vector<int>& nums, vector<int>& tmp) {      //tmp用于记录合并之前的两个子数组
        if(l>=r) return 0;
        //递归划分子数组
        int m=(l+r)/2;
        int result=mergesort(l, m, nums, tmp)+mergesort(m+1, r, nums, tmp);    
        //递归排序合并,并且计算逆序对
        int i=l, j=m+1;
        for(int k=l;k<=r;k++){
            tmp[k]=nums[k];
        }
        for(int k=l;k<=r;k++){      //循环遍历直到合并成l-r+1个数的数组。小的数先放入num中
            if(i==m+1){      //左子数组合并完,只需要添加当前右子数组
                nums[k]=tmp[j++];
            }
            else if(j==r+1||tmp[i]<=tmp[j]){      //右子数组合并完或左子数组当前元素小于当前右子数组元素,添加当前左子数组元素
                nums[k]=tmp[i++];
            }
            else{      //左子数组当前元素大于当前右子数组元素,当前左子数组剩下元素也都大于当前右子数组元素,添加添加当前右子数组,且逆序对个数为m-i+1
                nums[k]=tmp[j++];
                result+=m-i+1;
            }
        }
        return result;
    }

    int reversePairs(vector<int>& nums) {
        vector<int> tmp(nums.size());
        return mergesort(0, nums.size()-1, nums, tmp);
    }
};

作者:Krahets
链接:https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof/solutions/622496/jian-zhi-offer-51-shu-zu-zhong-de-ni-xu-pvn2h/
来源:力扣(LeetCode)

标签:tmp,mergesort,Offer,int,nums,51,逆序
From: https://www.cnblogs.com/fly-smart/p/17649756.html

相关文章

  • P1510 精卫填海
    东海未填平的区域还需要至少体积为v的木石才可以填平,而西山上的木石还剩下n块,每块的体积和把它衔到东海需要的体力分别为k和m。精卫已经填海填了这么长时间了,她也很累了,她还剩下的体力为c。如果精卫能把东海填平,则输出她把东海填平后剩下的最大的体力,否则输出Impossibl......
  • 最完美WIN11_Pro_23H2.22631.2199软件选装纯净版VIP51.9
    【系统简介】=============================================================1.本次更新母盘来自UUP_WIN11_Pro_23H2.22631.2199。进一步精简优化调整。2.只为呈现最好的作品,手工精简优化部分较多。3.OS版本号为22631.2199。个别要求高的就下MSDN吧,里面啥功能都有。4.集成《DrvCeo......
  • ios 开发之--逆序输出字符串
    //字符串反转NSString*str=@"abcedfghijklmnopqrstuvwxyz";NSMutableString*string=[NSMutableStringstringWithCapacity:str.length];intj=(int)str.length;for(inti=j-1;i>=0;i--){[stringappendFormat:@"%c......
  • 剑指 Offer 45. 把数组排成最小的数(中等)
    题目:classSolution{public:stringminNumber(vector<int>&nums){//这道题要学会重构字符串的比较排序vector<string>str;//将数组全部转化为字符串进行比较stringresult;for(inti=0;i<nums.size();i++){str.p......
  • 剑指 Offer 33. 二叉搜索树的后序遍历序列(中等)
    题目:结合以下图理解该方法classSolution{//本题要点:二叉搜索树性质:根节点一定大于所有左子树,一定小于所有右子树public:booltraversal(vector<int>&postorder,intl,intr){//l和r分别为当前树的左右边界if(l>=r)returntrue;int......
  • Android开发如何斩获高薪offer?给大家几点面试建议
    前言又到了每年的求职季,Android开发工程师在找工作过程对于简历设计和面试技巧通常会有一定的欠缺,而这往往是求职过程是否顺利的决定性因素。因此,掌握一定的面试技巧对于找互联网技术岗位的工作帮助非常大。本篇文章给大家分享一波面试必备技巧,全文是通过在阿里的面试官的交流整理......
  • SpringBoot复习:(51)默认情况下DataSource是怎么创建出来的,是什么类型的?
    DataSource是通过DataSourceAutoConfiguration创建的,这个类代码如下:可以看到DataSourceAutoConfiguration有个静态内部类PooledDataSourceConfiguration,在这个类上有个@Import注解,导入了DataSourceConfiguration.Hikari这个类,它的代码如下:可以看到,如果没有在配置文件指定spring......
  • 杭电ACM HDU 3351 Seinfeld
    SeinfeldTimeLimit:2000/1000MS(Java/Others)   MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):1071   AcceptedSubmission(s):540ProblemDescriptionI’moutofstories.ForyearsI’vebeenwritingstories,somerathersilly,......
  • 使用MD5算法和sha512sum校验和检验文件完整性
    目录一.前言二.MD5算法简介三.什么是校验和四.使用MD5算法和sha512sum校验和检验文件完整性五.总结一.前言在我们日常生活中,无论是下载文件、传输数据还是备份重要信息,如何确保数据的完整性始终是一个不能忽视的问题。本文将向大家介绍如何使用MD5算法和sha512sum校验和来进行文......
  • Leetcode 59. 螺旋矩阵 II && 剑指 Offer 29. 顺时针打印矩阵
    这两个题非常相似,但是前者较为简单,后者较难。由于前者访问的矩阵是方阵,因此可以通过迭代去做(因为方阵每次迭代,长和宽缩水的大小是一样的,但是矩阵不可以,因为矩阵最后一次迭代,长和宽的缩水不一定一样)classSolution{public:vector<vector<int>>generateMatrix(intn){......