剑指offer51.数组中的逆序对

剑指offer51.数组中的逆序对_第1张图片

 用类似于归并排序的方法解决这道题,把数组分成左右两个数组,然后归并排序,在排序的过程中统计逆序对的个数

剑指offer51.数组中的逆序对_第2张图片

剑指offer51.数组中的逆序对_第3张图片

 剑指offer51.数组中的逆序对_第4张图片

 剑指offer51.数组中的逆序对_第5张图片

 剑指offer51.数组中的逆序对_第6张图片

剑指offer51.数组中的逆序对_第7张图片

 剑指offer51.数组中的逆序对_第8张图片

剑指offer51.数组中的逆序对_第9张图片

剑指offer51.数组中的逆序对_第10张图片

剑指offer51.数组中的逆序对_第11张图片

 剑指offer51.数组中的逆序对_第12张图片

剑指offer51.数组中的逆序对_第13张图片

剑指offer51.数组中的逆序对_第14张图片

 剑指offer51.数组中的逆序对_第15张图片

剑指offer51.数组中的逆序对_第16张图片

剑指offer51.数组中的逆序对_第17张图片

剑指offer51.数组中的逆序对_第18张图片

 剑指offer51.数组中的逆序对_第19张图片

class Solution {
    int[] nums, tmp;
    public int reversePairs(int[] nums) {
         this.nums = nums;
         tmp = new int[nums.length];
         return mergeSort(0, nums.length-1);
    }
    private int mergeSort(int l, int r){
        //终止条件
        if(l >= r) return 0;
        //递归划分
        int m = (l + r) / 2;
        int res = mergeSort(l, m) + mergeSort(m+1, r);
        //合并阶段
        int i = l, j= m+1;
        for(int k = l; k<=r; k++){
            tmp[k] = nums[k];
        }
        for(int k = l; k<=r; k++){
            if(i == m+1){
                nums[k] = tmp[j++];
            }else if(j == r+1 || tmp[i] <= tmp[j]){
                nums[k] = tmp[i++];
            }else{
                nums[k] = tmp[j++];
                res += m - i + 1;//统计逆序对
            }
        }
        return res;
    }
}

你可能感兴趣的:(剑指offer,算法,leetcode,java)