一、题目
二、思路
思路一:冒泡排序
冒泡排序交换的次数即为逆序对的个数,但是冒泡排序的复杂度为O(n^2),会超时,这里还是把代码附上
三、思路一(冒泡排序,超时)
class Solution {
public:
int InversePairs(vector<int> data) {
if(data.empty())
{
return 0;
}
//冒泡排序
int Count=0;
for(int i=0;i<data.size()-1;++i)
{
for(int j=0;j<data.size()-i-1;++j)
{
if(data[j]>data[j+1])
{
swap(data[j],data[j+1]);
Count++;
Count=Count%1000000007;
}
}
}
return Count;
}
};
四、思路二(归并排序)
class Solution {
public:
int Count=0;
int InversePairs(vector<int> data) {
if(data.empty())
{
return 0;
}
//归并排序
vector<int>temp(data.size());
guibing(data,temp,0,data.size()-1);
return Count;
}
void guibing(vector<int> &data,vector<int>& temp,int start,int end)
{
if(start>=end)
{
return;
}
//定义四个变量
int left1=start;
int mid=(start+end)/2;
int right1=mid;
int left2=mid+1;
int right2=end;
//递归分治
guibing(data, temp,left1,right1);
guibing(data, temp,left2,right2);
//合并
int k=0;
while(left1<=right1 && left2<=right2)
{
if(data[left1]>data[left2])
{
temp[k++]=data[left2++];
//精髓之处,如果前面的都小于,最后徐一个大于B序列所有数,这个会循环B序列中数的个数次
Count=Count+right1-left1+1;
Count=Count%1000000007;
}
else
{
temp[k++]=data[left1++];
}
}
while(left1<=right1)
{
//Count=Count+end-mid;
//Count=Count%1000000007;
temp[k++]=data[left1++];
}
while(left2<=right2)
{
temp[k++]=data[left2++];
}
//将新数组复制回原数组
int m=0;
for(int i=start;i<=end;++i)
{
data[i]=temp[m++];
}
}
};