链接
https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/
题意
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数
解法
考虑两种思路,一种办法是用分治
考虑归并排序,每次将数组划分成两部分,左半部分和右半部分都降序排列
然后用双指针分别指向两个部分的头部,在归并的过程中完成逆序对的计算
时间复杂度为O(nlogn)
另一种解法是离散化+树状数组
考虑序列[7,5,6,4],用桶进行统计1
2index -> 1 2 3 4 5 6 7 8 9
value -> 0 0 0 1 1 1 1 0 0
可以看出,这一序列的第i-1位前缀和表示【有多少个数比i小】,因此从后往前遍历序列
每次记录当前位置的数所在的桶之前的前缀和,同时修改当前桶的数量
用树状数组完成这一更新和维护的过程,时间复杂度O(nlogn)
代码
分治做法
1 | class Solution { |
树状数组
1 | class Solution { |