数组中的逆序对

来源:互联网 发布:mac在线是什么意思 编辑:程序博客网 时间:2024/06/10 01:22

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 

IDEA

1.首先是暴利算法,即双重遍历数组,累加前数比后数大的个数

2.用归并算法

并排序的主要思想是将整个序列a[ ]分成两部分,分别递归将这两部分排好序之后,再和并为一个有序的序列

对于带合并的两个序列seq1和seq2seq1中的某个数a[i] eq2中的某个数a[j],如果a[i]<a[j],没有逆序数,如果a[i]>a[j],那么逆序数为seq2a[j]前边元素的个数(包括a[j]),即j-(mid+1)=j-mid, 这样累加每次递归过程的逆序数,得出总的逆序数

3.树状数组

CODE

2.归并算法

public class Solution {     public int InversePairs(int [] array) {            if(array.length==0){                return 0;            }            int count=mergeSort(array,0,array.length-1);            return count;        }                 public int mergeSort(int[] array,int l,int r){            if(l==r){                return 0;              }            int mid=(l+r)/2;            int lNum=mergeSort(array,l,mid);            int rNum=mergeSort(array,mid+1,r);            return (Sort(array,l,mid,r)+lNum+rNum)%1000000007;        }                 public int Sort(int[] array,int l,int mid,int r){            int i=mid,j=r,k=r-l;            int temp[]=new int[r-l+1];            int count=0;            while(i>=l&&j>=mid+1){                if(array[i]>array[j]){                    temp[k--]=array[i--];                    count+=(j-mid);                         count%=1000000007;                }else{                    temp[k--]=array[j--];                }            }            while(i>=l){                temp[k--]=array[i--];            }            while(j>=mid+1){                temp[k--]=array[j--];            }                        int p=0;            while(l<=r){                array[l++]=temp[p++];            }            return count;        }}


0 0
原创粉丝点击