Java 求解数组中的逆序对

题目:

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 

解题思路:本题最直观的方法是使用双重循环遍历数组,每遍历一个值便将其与后面的元素比较,这种解法的算法复杂度为O(n^2),下面提供一种复杂度为O(n)的算法,主要是借助归并排序的思想,先分治,每次合并的时候进行逆序对的计数

public class Solution {
    int count = 0;
    public int InversePairs(int [] array) {
        return mergeSort(array,0,array.length-1);
    }

    public int mergeSort(int[] array,int low,int high){
        if(lowint middle = (low+high)/2;
            mergeSort(array,low,middle);
            mergeSort(array,middle+1,high);
            count = count+merge(array,low,middle,high);
        }
        return count;
    }

    public int merge(int[] array,int low,int middle,int high){
        int i,j,k;
        //逆序对计数变量
        int count = 0;
        int n1 = middle-low+1;
        int n2 = high-middle;
        int[] L = new int[n1];
        int[] R = new int[n2];
        for(i=0,k=low;iarray[k];
        }
        for(i=0,k=middle+1;iarray[k];
        }

        for(i=0,j=0,k=low;iif(L[i]array[k] = L[i];
                i++;
            }else{
                if(L[i]>=R[j]){
                    int tempCount = 0;
                    while(iarray[k] = R[j];
                j++;
            }
        }

        if(i//          count = count+n1-i-1;
            for(j=i;jarray[k] = L[j];
            }
        }
        if(jfor(i=j;iarray[k] = R[i];
            }
        }
        return count;
    }

}

你可能感兴趣的:(leetcode)