关注
public class Solution { // 模数,用于防止溢出 public int mod = 1000000007; /** * 归并排序的变种,既排序数组也计算逆序对 * @param left 区间左端点 * @param right 区间右端点 * @param data 原数组 * @param temp 临时数组 * @return 逆序对数量 */ public int mergeSort(int left, int right, int [] data, int [] temp) { // 如果左端点大于或等于右端点,说明只有一个元素或没有元素,直接返回0 if (left >= right) return 0; // 计算区间中间位置 int mid = (left + right) / 2; // 递归地对左半部分和右半部分分别进行排序,并加上各自的逆序对数量 int res = mergeSort(left, mid, data, temp) + mergeSort(mid + 1, right, data, temp); // 防止res超出int的范围 res %= mod; // 初始化左右部分的起始指针 int i = left, j = mid + 1; // 将当前区间的数据复制到临时数组 for(int k = left; k <= right; k++) temp[k] = data[k]; // 对当前区间进行归并操作 for(int k = left; k <= right; k++) { // 如果左半部分已经完全归并,直接归并右半部分 if (i == mid + 1) data[k] = temp[j++]; // 如果右半部分已经完全归并,或者左半部分当前值小于等于右半部分当前值,归并左半部分 else if (j == right + 1 || temp[i] <= temp[j]) data[k] = temp[i++]; // 否则,存在逆序对,归并右半部分,并统计逆序对数量 else { data[k] = temp[j++]; // 添加逆序对数量 res += mid - i + 1; } } // 返回当前区间的逆序对数量 return res % mod; } /** * 计算数组中的逆序对数量 * @param array 输入数组 * @return 逆序对数量 */ public int InversePairs(int [] array) { int n = array.length; int[] res = new int[n]; // 创建临时数组 // 对整个数组进行归并排序并计算逆序对数量 return mergeSort(0, n - 1, array, res); } }
点赞
相关推荐
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 找工作能把i人逼成什么样 #
12032次浏览 156人参与
# 你认为工作的意义是什么 #
223336次浏览 1412人参与
# 你今年做了几份实习? #
8028次浏览 127人参与
# 说说你知道的学历厂 #
369390次浏览 1327人参与
# 你开始找寒假实习了吗? #
13817次浏览 201人参与
# 产品面经 #
238473次浏览 2099人参与
# 0经验如何找实习? #
24237次浏览 418人参与
# 大学最后一个寒假,我想…… #
71489次浏览 723人参与
# 大家每天通勤多久? #
63925次浏览 413人参与
# 你找工作经历过哪些骗局? #
8578次浏览 135人参与
# 大厂面试初体验 #
83007次浏览 378人参与
# 25年找工作是什么难度? #
14217次浏览 144人参与
# 实习越久越好,还是多多益善? #
16696次浏览 165人参与
# 一上班就想____,这正常吗? #
4560次浏览 90人参与
# 写简历别走弯路 #
870813次浏览 8699人参与
# 面试尴尬现场 #
203594次浏览 801人参与
# 字节出了豆包coding模型 #
6487次浏览 59人参与
# 什么样的公司千万别去 #
27131次浏览 143人参与
# 如何KTV领导 #
80332次浏览 521人参与
# 机械人晒出你的简历 #
144440次浏览 870人参与


查看23道真题和解析