题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。
输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
解题思路:
1、前面的数字大于后面的数字,是指前面所有的数字与后面某个数字比较,是所有,不是当前的前面
2、从小到大冒泡排序,冒泡的次数就是前面大于后面的对数,可是复杂度较高。
3、归并排序,
- package pratice718;
- import java.util.Stack;
- public class ReverseOrder {
- //题目描述:
- //在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。
- //输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
- //解题思路:
- //1、前面的数字大于后面的数字,是指前面所有的数字与后面某个数字比较,是所有,不是当前的前面
- //2、从小到大冒泡排序,冒泡的次数就是前面大于后面的对数,可是复杂度较高。
- //3、归并排序,
- static int count=0;
- public static int InversePairs(int [] array) {
- if(array==null || array.length==0) return 0;
- mSort(array,0,array.length-1);
- return count;
- }
- public static void mSort(int array[],int start,int end){
- if(start>=end) return;
- int middle = start+(end-start)/2;
- mSort(array,start,middle);
- mSort(array,middle+1,end);
- merge(array,start,end,middle);
- }
- public static void merge(int array[],int start,int end,int middle)
- {
- int temp[] = new int[end-start+1];
- int i=start,j=middle+1,k=0;
- while(i<=middle && j<=end){
- if(array[i]<array[j])
- temp[k++] = array[i++];
- else{
- temp[k++] = array[j++];
- count += middle - i+1;
- count%=1000000007;
- }
- }
- while(i<=middle)
- temp[k++] = array[i++];
- while(j<=end)
- temp[k++] = array[j++];
- for(k=0;k<temp.length;k++)
- {
- array[start+k] = temp[k];
- }
- }
- public static void main(String[] args) {
- int array[] = {1,2,3,4,5,6,7,0};
- System.out.println("result: "+InversePairs(array));
- }
- }
扫码关注一起随时随地学习!!!就在洋葱攻城狮,更多精彩,等你来!!