首页 > 其他分享 >【剑指 Offer】 51. 数组中的逆序对

【剑指 Offer】 51. 数组中的逆序对

时间:2023-04-30 11:13:39浏览次数:41  
标签:归并 Offer int nums 51 数组 序数 逆序

【题目】

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

 

示例 1:

输入: [7,5,6,4]
输出: 5

 

限制:

0 <= 数组长度 <= 50000

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof

【思路】

引入归并排序的思想,每一轮归并排序,实际上就是在比较两个数的逆序数,递归进行归并,同时记录每次递归的逆序数,累加就是逆序数的总和。

 

【代码】

class Solution {
    int[] nums,temp;
    public int reversePairs(int[] nums) {
        this.nums= nums;
        temp = new int[nums.length];
        return mergeSort(0,nums.length-1);
    }
    private int mergeSort(int l,int r){
        if(r<=l) return 0;
        int m = (l+r)/2;
        int res = mergeSort(l,m) + mergeSort(m+1,r);
        int i = l,j = m+1;
        // 将原始数组备份
        for(int k=l;k<=r;k++){
            temp[k]= nums[k];
        }
        for(int k =l;k<=r;k++){
            // 如果i(左边分组已经指向右边起始点)=m+1,则右边的按顺序存入即可
            if(i==m+1){
                nums[k] = temp[j++];
            // 如果j(右边分组已经指向右边终点)=r+1或当前左边指向的数小于右边,则左边按顺序存入即可
            }else if(j==r+1||temp[i]<=temp[j]){
                nums[k] = temp[i++];
            //否则,发生逆序情况,逆序个数为左边数的个数(因为右边小于左边的一个数,代表小于左边那个数右边的所有数) 数量为m-i+1
            }else{
                nums[k] = temp[j++];
                res +=m-i+1;
            }
        }
        return res;
    }
}

 

标签:归并,Offer,int,nums,51,数组,序数,逆序
From: https://www.cnblogs.com/End1ess/p/17365024.html

相关文章

  • ICS TRIPLEX工业备件T9481 T9451
    W;① ⑧ 0 ③ 0 ① 7 ⑦ ⑦ 5 ⑨   ICSTRIPLEX工业备件T9481T9451T9432T9431T9431T9402T9310-02PN-175486T9110T8800T8480CT8461CT8461T8431T8403CXT8403CT8312-4T8311T8310T8300T8231T8193T8191T8160T8151BT810091001.1四......
  • 【剑指 Offer】17. 打印从1到最大的n位数
    【题目】输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数999。示例1:输入:n=1输出:[1,2,3,4,5,6,7,8,9]来源:力扣(LeetCode)链接:https://leetcode.cn/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof【思路】直接写......
  • Gtk-Message: 09:56:19.551: Failed to load module "canberra-gtk-module"
    解决办法cmakemake....[100%]Builttargetopencv_exampleadmin@ub:~/opencv/samples/cpp/example_cmake/build$./opencv_exampleBuiltwithOpenCV4.6.0CaptureisopenedGtk-Message:09:56:19.551:Failedtoloadmodule"canberra-gtk-module"sudoap......
  • 使用VSCode取代Keil实现STM32和51单片机的开发
    使用VisualStudioCode开发STM32和51单片机,VSCode作为编辑器来开发嵌入式程序。视频教程:https://www.bilibili.com/video/BV18e4y1H7xX/VSCode简介VisualStudioCode是是由微软研发的一个轻量级但功能强大的源代码编辑器,这个软件是免费开源的,可在您的桌面上运行,并且可用于Windo......
  • 剑指 Offer II 083. 没有重复元素集合的全排列
     分析:今天看的明日一练,这道题有点忘了怎么做了先偷个懒,用了个全排列函数,后面再研究代码:1classSolution(object):2defpermute(self,nums):3"""4:typenums:List[int]5:rtype:List[List[int]]6"""7returnlis......
  • VAS5175A/VAS5176 两节/三节/四节2A开关降压型5V-24V输入锂电池充电管理方案
    电源电路是电子产品必不可少的单元电路,而电池供电又是便携式电子产品重要的组成部分。当下便携式电子产品越趋小型化,轻量化方向发展,所以锂电池是很多便携式电子产品的首选。单节锂电池充满电为4.2V或者4.35V,但不同领域或者不同消费市场的便携式电子产品对电源电压大小要求又不一样......
  • Redis WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/s
    RedisWARNING:TheTCPbacklogsettingof511cannotbeenforcedbecause/proc/sys/net/core/somaxconnissettothelowervalueof128. 内核参数默认128,对于负载很大的服务是不够的。改为2048或者更大echo2048> /proc/sys/net/core/somaxconn  系统重启后失效v......
  • 嵌入式开发入门-51单片机基础知识(8)- IIC
    一、IIC发送时序图从上图可以看出:起始条件:SCL线是高电平时,SDA线从高电平向低电平切换;停止条件:SCL线是高电平时,SDA线从低电平向高电平切换;首先SDA和SCL都处于空闲状态(SDA和SCL都为高电平时),然后,SDA跳变为低电平(可以理解为,SDA向SCL发出通知,我现在要准备发送数据......
  • 【剑指 Offer】49. 丑数
    【题目】我们把只包含质因子2、3和5的数称作丑数(UglyNumber)。求按从小到大的顺序的第n个丑数。 示例:输入:n=10输出:12解释:1,2,3,4,5,6,8,9,10,12是前10个丑数。说明:    1是丑数。   n不超过1690。来源:力扣(LeetCode)链接:https://leetcode.......
  • 调度器51—进程优先级 prio、static_prio、normal_prio、rt_priority
    一、概述structtask_struct{intprio;intstatic_prio;intnormal_prio;unsignedintrt_priority;...} 二、动态优先级——prioprio表示进程的当前优先级,是一个动态值,会在进程运行时不断变......