吐槽一下这个题目,题目说的好歹清楚一些啊,我看半天以为是相邻的两个数字算是逆序对,写了半天没给我过,看题解才知道是什么意思。还有,这个%1000000007是什么鬼啊???为什么要弄个这种东西。
言归正传,这道题用到了归并排序的思想,其实暴力法也行,但是会提示超时。
解题思路就是按照归并排序的思想,在归并左右两个数组的时候进行计数操作
由于归并left和right的时候已经默认排好序了,所以一旦出现left[i]>right[j]的情况,则left[i]后边的数(比如left[i+1],left[i+2]…left[mid])都是大于right[i]的,则此时令count=count+(mid-i+1),就会一次性增加一堆逆序对。
以下是代码:
public int InversePairs(int[] data)
{
MergeSort(data, 0, data.Length-1);
return count;
}
public void MergeSort(int[] array,int start,int end)
{
if(start>=end)
{
return;
}
int mid=(start+end)/2;
MergeSort(array, start, mid);
MergeSort(array, mid+1, end);
MergeOne(array, mid,start, end);
}
public void MergeOne(int[] array,int mid,int start,int end)
{
int[] temp=new int[end-start+1];
int k=0;
int i=start;
int j=mid+1;
while(i<=mid && j<=end)
{
if(array[i]<array[j])
{
temp[k]=array[i];
k++;
i++;
}
else
{
count=count+mid-i+1;
count=count%kmod;
temp[k]=array[j];
k++;
j++;
}
}
while(i<=mid)
{
temp[k]=array[i];
k++;
i++;
}
while(j<=end)
{
temp[k]=array[j];
k++;
j++;
}
for(int a=0;a<temp.Length;a++)
{
array[start+a]=temp[a];
}
}