关注
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); } }
点赞
相关推荐
02-05 22:43
武汉大学 Java 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 春招什么时候投? #
1740次浏览 24人参与
# 聊聊Agent开发 #
6934次浏览 184人参与
# 春节前,你还在投简历吗? #
3274次浏览 38人参与
# 推荐一个值得做的AI项目 #
2160次浏览 66人参与
# 你的房租占工资的比例是多少? #
84914次浏览 873人参与
# 春节提前走,你用什么理由请假? #
1514次浏览 31人参与
# 你上一次给父母打电话是什么时候 #
35275次浏览 246人参与
# 每个月的工资都是怎么分配的? #
85674次浏览 672人参与
# 距离春招还有一个月,你现在是什么开局? #
1615次浏览 29人参与
# 暑期实习什么时候投? #
2214次浏览 44人参与
# 你认为哪个岗位找工作最卷 #
61760次浏览 250人参与
# 新年的第一句祝福 #
56209次浏览 393人参与
# 实习想申请秋招offer,能不能argue薪资 #
218042次浏览 1167人参与
# 工作一周年分享 #
51554次浏览 272人参与
# 非技术2023笔面经 #
332182次浏览 2711人参与
# 一份好的简历长什么样? #
25090次浏览 447人参与
# 考公VS就业,你怎么选? #
92429次浏览 514人参与
# 你觉得机械有必要实习吗 #
73827次浏览 489人参与
# 汇川技术求职进展汇总 #
179588次浏览 1058人参与
# 简历当中有水分算不算造假? #
159312次浏览 2265人参与
查看8道真题和解析