经典题型:求数组中逆序对的数量
- 题目
- 思路
- 代码
题目
链接
思路
步骤一:两个指针指向两个有序区间,进行合并操作。
步骤二:1与前面的区间,构成逆序对,个数就是前面区间的个数。
步骤三:前面数组指向的元素2较小,放回原始数组,2与后面数组不构成逆序对,不管他。
以此类推。。。。
总结:在合并的过程中,如果前面区间指向的元素小,不用管,如果后面区间的小,就要加上前面区间的个数。
代码
class Solution {int res=0;int[]tmp;public int reversePairs(int[] record) {tmp=new int[record.length];MergeSort(record,0,record.length-1);return res;}//对record数组归并排序,[left,right]上void MergeSort(int[]record,int left,int right){if(left>=right){return;}//1.分成两个区间[left,mid][mid+1,right]int mid=(left+right)/2;//2.对两个区间排好序MergeSort(record,left,mid);MergeSort(record,mid+1,right);//3.合并两个区间int p1=left,p2=mid+1,p3=left;while(p1<=mid&&p2<=right){if(record[p1]<=record[p2]){tmp[p3++]=record[p1++];}else{tmp[p3++]=record[p2++];res+=mid-p1+1;//mid-p1+1是左区间剩下的个数}}while(p1<=mid){tmp[p3++]=record[p1++];}while(p2<=right){tmp[p3++]=record[p2++];}for (int i = left; i <=right ; i++) {record[i]=tmp[i];}}
}