Leetcode-每日一题【剑指 Offer 51. 数组中的逆序对】

news2024/12/23 13:48:04

题目

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

示例 1:

 

解题思路

前置知识

分治法
设计思想:
将规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。

分治法所能解决的问题一般具有以下几个特征:

  • 该问题的规模缩小到一定的程度就可以容易地解决。
  • 该问题可以分解为若干个规模较小的相同问题。
  • 利用该问题分解出的子问题的解可以合并为该问题的解。
  • 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。

求解步骤:

  • 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题。
  • 求解子问题:若子问题规模较小而容易被解决则直接求解,否则递归地求解各个子问题。
  • 合并:将各个子问题的解合并为原问题的解。
     

大概知道了分治法的思想后,我们来一起看一下这道题 

1.题目要求我们求出所给数组中的逆序对,我们首先想到的方法可能是去暴力求解,也就是两个for循环去两两比较,但是这种方法会超出时间限制。所以我们换一种思路,利用分治法来解决问题,为了能够更好的理解,我用图片的形式来讲述。

2.下面我们来举一个最极限的栗子:[8,7,6,4,3,2,1]

这个数组中的每一个数都与后面的数形成逆序对

 分治的思想就是要把一个问题拆分为k个规模较小的问题,所以我们以二分的形式对数组进行拆分。

 

计算逆序对的数量的操作就发生在我们的合并过程中,首先我们让 i = left,j =  mid + 1,

当 i > j 时,我们就将 j 先排进数组,此时我们发现 i 指向的数组中存在一个比 j 大的元素,也就是说 7 之前存在一个 8 比它大,那么我们就应该设置一个count,让它加一来记录下这个逆序对

 ​​​​​​​

同理可得,合并完第一次后,我们的count计算器就变为了4,还生成了4个新的有序数组

 此时我们依旧让i = left,j =  mid + 1,然后比较 i 和 j 的大小,若 i < j ,那么就让 i 直接排进数组,若 i > j,那么我们就需要计算出 i 所指向的数组中所剩的元素,因为当  i > j 时,j 所指向的元素比 i 所指向的有序数组中的最小的元素还要小,那么 j 必然跟 i 所指向的数组中所剩的所有元素构成逆序对,所以我们要计算出 i 所指向的数组中所剩的元素个数并于count 相加

 ​​​​​

 

此时 j 指向的数组已经为空,我们只需要将 i 所指向的数组排入即可

 

 

此时 j 所指向的数组已经遍历结束,我们将 i 指向的数组排入即可

 

至此,我们就统计了此数组中所存在的逆序对个数 。

代码实现

class Solution {
    public int reversePairs(int[] nums) {
        int len = nums.length;
        if(len < 2){
            return 0;
        }
        int[] copy = new int[len];
        for(int i = 0; i < len; i++){
            copy[i] = nums[i];
        }
        int[] temp = new int[len];
        return reversePairs(copy, 0, len - 1, temp);

    }
    private int reversePairs(int [] nums, int left, int right, int[] temp){
        if(left == right){
            return 0;
    }
    int mid = left + (right - left) / 2;
    int leftnum = reversePairs(nums, left, mid, temp);
    int rightnum = reversePairs(nums, mid + 1, right, temp);
    if(nums[mid] <= nums[mid + 1]){
        return leftnum + rightnum;
    }
    int combine = merge(nums, left, mid, right, temp);
    return combine + leftnum + rightnum;
}
    private int merge(int[] nums, int left, int mid, int right, int[] temp){
        for(int i = left; i <= right; i++){
            temp[i] = nums[i];
        }
        int i = left;
        int j = mid + 1;

        int count = 0;
        for(int k = left; k <= right; k++){
            if(i == mid + 1){
                nums[k] = temp[j];
                j++;
            }else if(j == right + 1){
                nums[k] = temp[i];
                i++;
            }else if(temp[i] <= temp[j]){
                nums[k] = temp[i];
                i++;
            }else{
                nums[k] = temp[j];
                j++;
                count += (mid - i + 1);
            }
        }
        return count;
    }
    
}

测试结果

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/791163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解析LED防蓝光灯珠技术原理

LED防蓝光灯珠能有效减少蓝光对眼睛的持续伤害&#xff0c;通过便携式光谱分析仪对比检测&#xff0c;使用LED防蓝光灯珠后&#xff0c;手机屏幕发出的蓝光强度得到了有效抑制&#xff0c;减少了有害蓝光对眼睛的伤害。LED防蓝光灯珠主要是通过将有害蓝光进行反射&#xff0c;或…

(css)AI智能问答页面布局

(css)AI智能问答页面布局 效果&#xff1a; html <!-- AI框 --><div class"chat-top"><div class"chat-main" ref"chatList"><div v-if"!chatList.length" class"no-message"><span>欢迎使…

<PrivateImplementationDetails>.ComputeStringHash 错误解决办法

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 CS0119 “PrivateImplementationDetails”是一个 类型&#xff0c;这在给定的上下文中无效 G:\\_Default.cs 26 活动 用 ILSPY 或者 .NET Reflector 、dnspy 等反编译出来之后 <Privat…

专访伊士曼中国区高管赵志伟:以创新应对新能源汽车后市场变化

受访人&#xff1a;伊士曼高性能膜事业部中国区商务总监赵志伟 新能源汽车发展至规模化阶段&#xff0c;以贴膜、保养维修为主的后市场产业迎来快速崛起&#xff0c;新能源消费者在汽车贴膜、改装和养护领域也表现出比燃油车更高频的需求度。 作为一家全球特种材料公司&#x…

【iOS】KVOKVC原理

1 KVO 键值监听 1.1 KVO简介 KVO的全称是Key-Value Observing&#xff0c;俗称"键值监听"&#xff0c;可以用于监听摸个对象属性值得改变。 KVO一般通过以下三个步骤使用&#xff1a; // 1. 添加监听 [self.student1 addObserver:self forKeyPath:"age"…

Windows实现端口转发(附配置过程图文详解)

文章目录 1. 前言2. 命令提示符3. 防火墙4. netsh 命令4.1 查看已有的转发规则4.2 新增转发规则4.3 删除转发规则 5. 图解汇总6. 欢迎纠正~ 1. 前言 利用Windows端口转发&#xff0c;实现本地设备 ⬅➡ 公网主机 ⬅➡ 远端服务器 2. 命令提示符 以管理员身份打开“命令提示…

【雕爷学编程】Arduino动手做(88)---水流量传感器模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

2023年深圳杯数学建模C题无人机协同避障航迹规划

2023年深圳杯数学建模 C题 无人机协同避障航迹规划 原题再现&#xff1a; 平面上A、B两个无人机站分别位于半径为500 m的障碍圆两边直径的延长线上&#xff0c;A站距离圆心1 km&#xff0c;B站距离圆心3.5 km。两架无人机分别从A、B两站同时出发&#xff0c;以恒定速率10 m/s…

Codeforces Round 888 (Div. 3)

原题链接&#xff1a;Dashboard - Codeforces Round 888 (Div. 3) - Codeforces 目录 A. Escalator Conversations B. Parity Sort C. Tiles Comeback D. Prefix Permutation Sums E. Nastya and Potions F. Lisa and the Martians A. Escalator Conversations 题意&…

【Python从入门到人工智能】14个必会的Python内置函数(7)——数据格式化处理综合应用场景 (实现程序主界面)

总觉得忍一忍就会好起来。真笨&#xff0c;人家不就是觉得你会忍一忍&#xff0c;所以才这样对你吗&#xff1f;当我们凶狠地对待这个世界的时候&#xff0c;才会发现这个世界&#xff0c;突然变得温文尔雅了。——余华《在细雨中呼喊》 &#x1f3af;作者主页&#xff1a; 追光…

第二章:Learning Deep Features for Discriminative Localization ——学习用于判别定位的深度特征

0.摘要 在这项工作中&#xff0c;我们重新审视了在[13]中提出的全局平均池化层&#xff0c;并阐明了它如何明确地使卷积神经网络&#xff08;CNN&#xff09;具有出色的定位能力&#xff0c;尽管它是在图像级别标签上进行训练的。虽然这个技术之前被提出作为一种训练规范化的手…

Docker构建Nginx镜像并部署前台应用

文章目录 1. 简介2. 准备工作3. 编写Dockerfile4. 编写nginx.conf5. 构建镜像6. 查看镜像是否构建成功7. 运行容器8. 访问Web应用9. 总结 1. 简介 Docker是一个开源的容器化平台&#xff0c;它可以帮助我们快速构建、发布和运行应用程序&#xff0c;实现应用程序的环境隔离和依…

全国大学生数据统计与分析竞赛2021年【本科组】-B题:用户消费行为价值分析

目录 摘 要 1 任务背景与重述 1.1 任务背景 1.2 任务重述 2 任务分析 3 数据假设 4 任务求解 4.1 任务一&#xff1a;数据预处理 4.1.1 数据清洗 4.1.2 数据集成 4.1.3 数据变换 4.2 任务二&#xff1a;对用户城市分布情况与分布情况可视化分析 4.2.1 城市分布情况可视化分析 4…

PWM定时器精准定时实现led闪烁(S3C2440裸机开发)

文章目录 前言一、PWM定时器原理二、使用步骤总结 前言 上期和大家分享了使用PWM定时器输出周期方波驱动蜂鸣器&#xff0c;那么本期分享的内容是使用PWM定时器实现定时器的功能&#xff0c;有了上期的基础&#xff0c;这期分享的内容大家理解起来应该非常easy&#xff0c;接下…

Psyco模块能优化Python的运行速度吗

目录 什么是Psyco模块 Psyco模块有什么作用 什么时候用Psyco模块 Psyco模块能优化Python的运行速度吗 总结 什么是Psyco模块 Psyco是一个用于优化Python代码的第三方模块。它的目标是通过即时编译&#xff08;Just-In-Time Compilation&#xff09;技术来提高Python程序的…

如何把pdf转成word文档格式?分享三个好用方法!

PDF文件和Word文档是我们日常生活和工作中最常见的两种文档格式。尽管PDF以其稳定的格式和出色的跨平台兼容性受到人们的喜爱&#xff0c;但在文本编辑方面&#xff0c;Word文档更具有灵活性。因此&#xff0c;将PDF转换为Word文档的需求在我们日常生活中非常常见。这篇文章将为…

微信小程序入门教程||微信小程序 小程序宿主环境||微信小程序 小程序协同工作和发布

微信小程序 小程序宿主环境 小程序宿主环境 我们称微信客户端给小程序所提供的环境为宿主环境。小程序借助宿主环境提供的能力&#xff0c;可以完成许多普通网页无法完成的功能。 上一章中我们把小程序涉及到的文件类型阐述了一遍&#xff0c;我们结合 QuickStart 这个项目来…

Access设置或取消密码

数据库密码”解决办法 Access设置或取消密码提示““必须保持数据库打开才可专门用于设置或删除数据库密码”” 解决方法&#xff1a; 按照提示的描述&#xff0c;需要“打开转属项”。 其实&#xff0c;这里是指需要以独占方式打开文件&#xff0c;打开方式如下&#xff1a…

常用协议的相关

远程登录协议&#xff1a; 23端口&#xff0c;TCP连接。 C/S方式。 文本传输协议FTP&#xff1a; C/S方式。 建立两条TCP连接&#xff0c;一条用于传送控制信息&#xff0c;一条用于传送文件内容。 FTP的控制连接采用了Telent协议。主要是用来进行简单的身份认证系统&…

中文人物关系知识图谱(含码源):中文人物关系图谱构建、数据回标、基于远程监督人物关系抽取、知识问答等应用.

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…