关注
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); } }
点赞
相关推荐
昨天 18:10
四川大学 其他机械职位 小型域名服务器:啊?我一直都这样啊?我还以为是我爱贪小便宜呢?每次去实验室都得接一杯免费的开水回去,出门都得规划一下最短路径,在宿舍就吃南边的食堂,在实验室就吃北边的食堂,快递只有顺路的时候才取。
点赞 评论 收藏
分享
牛客热帖
正在热议
# 25届秋招总结 #
245748次浏览 2002人参与
# 学历or实习经历,哪个更重要 #
40927次浏览 298人参与
# 北方华创开奖 #
22693次浏览 257人参与
# 地方国企笔面经互助 #
2507次浏览 6人参与
# 你最想要的公司福利是? #
39748次浏览 124人参与
# 选完offer后,你后悔学本专业吗 #
10174次浏览 75人参与
# 面试题刺客退退退 #
136931次浏览 2090人参与
# 国企/银行/研究所公司爆料 #
89621次浏览 411人参与
# 应届生被毁约被毁意向了怎么办 #
26965次浏览 238人参与
# 一觉醒来,我觉醒了超级打工人系统 #
2836次浏览 35人参与
# 机械应届生薪资要多少才合适? #
12362次浏览 60人参与
# 查收我的offer竞争力报告 #
16561次浏览 227人参与
# 校招入职后的感受 #
156842次浏览 1959人参与
# 你觉得第一学历对求职有影响吗? #
14851次浏览 121人参与
# 没有实习经历,还有机会进大厂吗 #
804843次浏览 13813人参与
# 我的工作日记 #
21111次浏览 270人参与
# 不给转正的实习,你还去吗 #
1516537次浏览 16964人参与
# 寒假躺平还是提前实习 #
58328次浏览 438人参与
# 总结:哪家公司面试体验感最差 #
25624次浏览 129人参与
# 秋招OC许愿 #
226338次浏览 1869人参与
# 如何写一份好简历 #
601671次浏览 8428人参与