LeetCode 每日一题 04/24

https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/

这个题最简单的解法就是直接双循环遍历数组,然后统计后者小于前者的对数。但是很明显这个O(N^2)的算法这里会T。

然后我看了题解才发现这个题他们使用归并排序来解题,真的是万万没想到啊。

官方解析已经很清晰了,而且还配有视频,这里就不说自己的理解了。

这个题主要还是帮我复习了一下归并排序的实现,有些东西久了不用就容易生疏。

class Solution {
    int res = 0;
public int reversePairs(int[] nums) {
        if(nums == null || nums.length == 0){
            return  0;
        }
        int[] newNums = Arrays.copyOfRange(nums,0,nums.length);
        mergeSort(newNums,0,newNums.length-1);
        return res;
    }

    private void mergeSort(int[] nums, int l, int r){
        if(l >= r){
            return;
        }
        int mid = l + (r-l) / 2;
        mergeSort(nums,l,mid);
        mergeSort(nums, mid+1, r);
        merge(nums,l,mid,r);
    }

    private void merge(int[] nums,int start, int mid, int end){
        int i = start, j = mid+1;
        int k = 0;
        int[] temp = new int[end - start +1];
        while(i <= mid && j <= end){
            if(nums[i] <= nums[j]){
                temp[k++] = nums[i];
                i++;
            }else {
                temp[k++] = nums[j];
                res += (mid-i+1);
                j++;
            }
        }
        while(i <= mid){
            temp[k++] = nums[i];
            i++;
        }
        while(j <= end){
            temp[k++] = nums[j];
            j++;
        }
        if (temp.length >= 0) System.arraycopy(temp, 0, nums, start, temp.length);
    }
}
View Code
原文地址:https://www.cnblogs.com/ZJPaang/p/12766320.html