题解 | #数组中的逆序对#

数组中的逆序对

https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型
     */
    public int InversePairs(int[] nums) {
        if (nums == null || nums.length <= 1) {
            return 0;
        }

        return mergeSort(nums, 0, nums.length - 1) % 1000000007;
    }

    /**
     * 归并排序,统计逆序对的数量
     * @param nums 数组
     * @param left 左边界
     * @param right 右边界
     * @return 逆序对的数量
     */
    public int mergeSort(int[] nums, int left, int right) {
        if (left >= right) {
            return 0;
        }
        int mid = (left + right) / 2;
        // 分别对左右两个部分进行归并排序
        int leftNum = mergeSort(nums, left, mid);
        int rightNum = mergeSort(nums, mid + 1, right);
        // 合并左右两个有序数组并统计逆序对数量
        int leftAndRight = merge(nums, left, mid, right);
        // 返回当前合并阶段发现的逆序对数量
        return rightNum + leftNum + leftAndRight;
    }

    /**
     * 合并两个有序数组,并统计逆序对的数量
     * @param nums 数组
     * @param left 左边界
     * @param mid 中间索引
     * @param right 右边界
     * @return 当前合并阶段发现的逆序对数量
     */
    public int merge(int[] nums, int left, int mid, int right) {
        int[] temp = new int[right - left + 1];
        int leftStart = left;
        int rightStart = mid + 1;
        int index = 0;
        int count = 0; // 统计逆序对的数量

        while (leftStart <= mid && rightStart <= right) {
            if (nums[leftStart] <= nums[rightStart]) {
                temp[index++] = nums[leftStart++];
            } else {
                temp[index++] = nums[rightStart++];
                // 统计逆序对的数量,因为右边数组有一个元素小于左边数组的当前元素,说明构成了逆序对
                count += mid - leftStart + 1;
                // 对逆序对数量进行取模,避免溢出
                count %= 1000000007;
            }
        }

        // 将左边数组剩余的元素复制到临时数组
        while (leftStart <= mid) {
            temp[index++] = nums[leftStart++];
        }

        // 将右边数组剩余的元素复制到临时数组
        while (rightStart <= right) {
            temp[index++] = nums[rightStart++];
        }

        // 将临时数组中的元素拷贝回原数组
        for (int i = 0; i < temp.length; i++) {
            nums[left + i] = temp[i];
        }

        // 返回当前合并阶段发现的逆序对数量
        return count;
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 14:10
啊啊啊啊好幸福,妈妈是我找工作发疯前的一束光
黑皮白袜臭脚体育生:看了这篇帖子之后已经第一百次质问老妈,仍然没有得到我的老妈是老板的回答
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务