LeeCode日记 面试题51.数组中的逆序对

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

示例 1:

输入: [7,5,6,4]
输出: 5
 

限制:

0 <= 数组长度 <= 50000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:利用归并排序
LeeCode日记 面试题51.数组中的逆序对_第1张图片

class Solution {
    public int reversePairs(int[] nums) {
        int len = nums.length;
        if(nums==null||len<2){
            return 0;
        }
        int[] help= new int [len];
        return mergeSort(nums,0,len-1,help);
        
    }
    
     public int mergeSort(int[] arr,int left,int right,int[] help){
        if(left==right){
            return 0;
        }
         int mid = left+(right-left)/2;
         int p1 = mergeSort(arr,left,mid,help);
         int p2 = mergeSort(arr,mid+1,right,help);
         int p3 = merge(arr,left,mid,right,help);
         return (p1+p2+p3);
    }
    public int merge(int[] arr,int left,int mid,int right,int[] help){
        int l = left;
        int r = mid+1;
        int count = 0;
        int i = 0;
        while(l<=mid&&r<=right){
            if(arr[l]<=arr[r]){
                help[i++] = arr[l++];
            }else{
            //arr[l]比arr[r]大,他们可以构成逆序对了,
            //而且左边的数是有序的,所以剩下的数也可以与arr[r]构成逆序对,共计mid-l+1个
                help[i++] = arr[r++];
                count = count+mid-l+1;
            }
        }
        while(l<=mid){
            help[i++] = arr[l++];
        }
          while(r<=right){
            help[i++] = arr[r++];
        }
        for( i = 0;i<right-left+1;i++){
            arr[left+i] = help[i];
        }
        
        return count;
    }

}

你可能感兴趣的:(LeetCode)