记得考研一战华科软院的时候,华科专业课也出过这个题,当时还强调要求写出时间复杂度为O(n*logn)
,看网上人家写的答案那叫一个懵逼啊。
今天有幸把这题做出来,顺带纪念下青春吧。
剑指 Offer 51. 数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
1
2
3 > 输入: [7,5,6,4]
> 输出: 5
>
限制:
1
2 > 0 <= 数组长度 <= 50000
>
暴力法
思路: 暴力法是很容易想到的方法,把当前元素逐个的与后续的元素比较,若当前元素大于后续元素则构成逆序对。
时间复杂度为O(n^2)
,一般的OJ平台是会TLE
的
1 | class Solution { |
分治
由于暴力法并没有记录上次遍历有关的信息,所以在下次遍历的过程中又重新遍历一次。
我们可以通过什么方法来减少遍历的次数呢?利用阶段性的信息去逐渐得到最终的结果。
这道很经典的问题可以用归并排序的方式来解决。
我们以[1,4,7,2,3,8,0,5]
为例子,通过下图来看看如何做到的实现统计逆序对。
1 | class Solution { |