首页 > 编程语言 > 详细

LeetCode求数组中的逆序对

时间:2020-05-24 22:13:42      阅读:50      评论:0      收藏:0      [点我收藏+]
public class Solution {

    public int reversePairs(int[] nums) {
        if (nums.length < 2) {
            return 0;
        }

        int[] temp = new int[nums.length];
        return mergeSort(nums,0, nums.length-1, temp);
    }

    private int mergeSort(int[] nums, int left, int right, int[] temp) {
        if(left < right) {
            int mid = (left + right) / 2;
            int leftNum = mergeSort(nums, left, mid, temp);
            int rightNum = mergeSort(nums, mid+1, right, temp);

            return leftNum + rightNum + merge(nums, left, mid, right, temp) ;//逆序个数等于左边逆序的个数+右边逆序的个数+左右逆序的个数
        }

        return 0;
    }

    private int merge(int[] nums, int left, int mid, int right, int[] temp) {
        int count = 0;
        int i = left ;
        int j = mid+1;
        int k = left;
        while (i<=mid && j <= right) {
            if(nums[i] <= nums[j]) {
                temp[k] = nums[i];
                i++;
            } else {
                temp[k] = nums[j];
                j++;
                count += mid-i+1;//如果有右边的小于左边的,那么就是从i到mid所有的都是逆序的
            }
            k++;
        }

        while (i <= mid) {
            temp[k] = nums[i];
            i++;
            k++;
        }

        while(j <= right) {
            temp[k] = nums[j];
            j++;
            k++;
        }

        if (right + 1 - left >= 0)
            System.arraycopy(temp, left, nums, left, right + 1 - left);

        return count;
    }
}

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

核心思想:分治法,利用归并排序,求归并排序左右不一样的节点

LeetCode求数组中的逆序对

原文:https://www.cnblogs.com/iamzhoug37/p/12952813.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!