关注
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); } }
点赞
相关推荐
09-10 13:55
门头沟学院 自动化 点赞 评论 收藏
分享

点赞 评论 收藏
分享
08-15 15:41
门头沟学院 Java 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 刚入职就____,这样正常吗? #
31162次浏览 272人参与
# 哪些公司对双非友好 #
51384次浏览 400人参与
# 小红书校招直播来了 #
18127次浏览 159人参与
# 你是怎么和mt相处的? #
26491次浏览 164人参与
# 面试反问你会问什么 #
35183次浏览 520人参与
# 实习返校后,你的精神状态是__? #
19446次浏览 109人参与
# 最难的技术面是哪家公司? #
40414次浏览 681人参与
# 你朋友圈最大的人脉是谁? #
12671次浏览 107人参与
# 上班苦还是上学苦呢? #
270590次浏览 1715人参与
# 实习必须要去大厂吗? #
124427次浏览 1469人参与
# 关于求职,我有X不投 #
19021次浏览 129人参与
# 秋招遇到的奇葩面试题 #
29880次浏览 164人参与
# 这个工作能去吗 #
12029次浏览 103人参与
# 招银网络求职进展汇总 #
133847次浏览 874人参与
# 机械人,你被简历秒挂的企业有哪些? #
56369次浏览 320人参与
# 找工作前vs找工作后的心路变化 #
17920次浏览 151人参与
# 考研可以缓解求职焦虑吗 #
64078次浏览 493人参与
# 4399求职进展汇总 #
28023次浏览 153人参与
# kpi面有什么特征 #
71313次浏览 452人参与
# 周六调休日,你打算几点下班? #
22906次浏览 111人参与
# 被AI治愈的瞬间 #
74172次浏览 657人参与