一、题目
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P,并将P对1000000007取模的结果输出。 即输出 P%1000000007。。
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
- 对于%50的数据,size<=10^4
- 对于%75的数据,size<=10^5
- 对于%100的数据,size<=2*10^5
示例1:
输入
1,2,3,4,5,6,7,0
输出
7
二、分析及代码
1. 归并排序
(1)思路
本题可结合归并排序的思路进行求解:每次归并过程中,(假设从小到大排序)较大的数字从前侧跨越较小的后侧数字进入新位置时,超过的较小数字个数就是逆序对的数目。
结合题目提示,本题结果可能量级较大,可通过每次累加后进行取模运算解决。
(2)代码
public class Solution {
public int InversePairs(int [] array) {
if (array == null || array.length == 0)
return 0;
return Sort(array, 0, array.length);
}
public int Sort(int[] array, int left, int right) {
if (right - left < 2)
return 0;
int mid = (left + right) >> 1;
int num = 0;
num += Sort(array, left, mid);
num += Sort(array, mid, right);
int [] tempArray = new int[right - left];
int l = left, r = mid;
for (int i = left; i < right; i++) {
if (r == right || (l < mid && array[l] < array[r])) {
tempArray[i - left] = array[l++];
} else {
tempArray[i - left] = array[r++];
num += mid - l;
num %= 1000000007;
}
}
for (int i = left; i < right; i++)
array[i] = tempArray[i - left];
return num;
}
}
(3)结果
运行时间:464ms,占用内存:50408k。
三、其他
暂无。