Live2D

数组中的逆序对

/*
      在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
    
输入: [7,5,6,4]
输出:  5 
*/
//其实就是归并排序  在左侧的一个元素大于右数组的一个元素时 左侧元素本身以及左数组剩余的元素都能组成一个逆序对
class Solution {
    private int count = 0;
    public int reversePairs(int[] nums) {
        int[] temp = new int[nums.length];
        mergeSort(nums,0,nums.length-1,temp);
        return count;
    }

    public void mergeSort(int[] arr, int left, int right, int[] temp) {

        if (left < right) {
            int mid = (left + right) / 2;
            mergeSort(arr, left, mid, temp);
            mergeSort(arr, mid+1, right, temp);
            merge(arr,left,mid,right,temp);
        }
        //return temp;
    }

    public void merge(int[] arr, int left, int mid, int right, int[] temp) {
        int k = left;
        int j = mid + 1;
        int i = 0;
        while (k <= mid && j <= right) {
            if(arr[k]<=arr[j]){
                temp[i++] = arr[k++];
            }else{
                count += mid-k+1;
                temp[i++] = arr[j++];
            }
        }
        while (k <= mid){
            temp[i++] = arr[k++];
        }
        while (j <= right){
            temp[i++] = arr[j++];
        }

        i = 0;
        while(left <= right){
            arr[left++] = temp[i++];
        }
    }
}
posted @ 2021-02-10 20:41  细雪之舞0213  阅读(82)  评论(0)    收藏  举报