关注
第四题代码,ac import java.util.Scanner;
public class Netease4 {
private static long count = 0;
//辅助归并排序的数组
private static int[] helper;
//用来存位置信息
private static int[] oldIndex;
//类似于helper数组的问题辅助oldIndex数组的
private static int[] oldIndex2;
/**
* 跟归并求逆序对个数一样的思路,只是存储了每个数关于索引位置的信息来计算
* @param args
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
helper = new int[n];
oldIndex = new int[n];
oldIndex2 = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = sc.nextInt();
oldIndex[i] = i;
oldIndex2[i] = i;
}
mergeSort(nums, 0, n - 1);
System.out.print(count);
}
private static void mergeSort(int[] nums, int low, int high) {
if (high - low == 1) {
if (nums[low] > nums[high]) {
count++;
swap(nums, low, high);
swap(oldIndex, low, high);
swap(oldIndex2, low, high);
}
return;
}
if (high == low) {
return;
}
int mid = low + (high - low) / 2;
mergeSort(nums, low, mid);
mergeSort(nums, mid + 1, high);
int index1 = mid, index2 = high, i = high;
for (i = high; i >= low; i--) {
if (index1 < low || index2 < mid + 1) {
break;
}
if (nums[index1] <= nums[index2]) {
helper[i] = nums[index2];
oldIndex2[i] = oldIndex[index2];
index2--;
}else {
helper[i] = nums[index1];
for (int j = mid + 1; j <= index2; j++) {
count += oldIndex[j] - oldIndex[index1];
}
oldIndex2[i] = oldIndex[index1];
index1--;
}
}
//如果哪边没用完
if (index1 >= low) {
while (index1 >= low) {
helper[i] = nums[index1];
index1--;
i--;
}
}else {
while (index2 >= mid + 1) {
helper[i] = nums[index2];
oldIndex2[i] = oldIndex[index2];
index2--;
i--;
}
}
for (int j = low; j <= high; j++) {
nums[j] = helper[j];
oldIndex[j] = oldIndex2[j];
}
}
private static void swap(int[] nums, int a, int b) {
int tmp = nums[a];
nums[a] = nums[b];
nums[b] = tmp;
}
}
/*
5
2 3 4 2 5
5
3 1 4 2 5
5
3 2 4 1 5
9
3 1 4 2 5 2 6 7 8
*/
查看原帖
点赞 评论
相关推荐
06-17 00:26
门头沟学院 Java 
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 技术岗笔试题求解 #
77594次浏览 1005人参与
# 拼多多求职进展汇总 #
642342次浏览 4983人参与
# 工作一周年分享 #
30698次浏览 179人参与
# 如果公司给你放一天假,你会怎么度过? #
16249次浏览 122人参与
# 作业帮求职进展汇总 #
55758次浏览 370人参与
# 华子oc时间线 #
1236418次浏览 6473人参与
# OPPO求职进展汇总 #
662176次浏览 5032人参与
# 总结:哪家公司面试体验感最差 #
60475次浏览 273人参与
# 职场上哪些事情令人讨厌 #
18719次浏览 91人参与
# 三一重工求职进展汇总 #
14313次浏览 65人参与
# 去年你投递实习了吗? #
21991次浏览 329人参与
# 这些公司卡简历很严格 #
41287次浏览 204人参与
# 扒一扒那些奇葩实习经历 #
66306次浏览 913人参与
# 经纬恒润求职进展汇总 #
121662次浏览 1032人参与
# 提前批过来人的忠告 #
113858次浏览 1194人参与
# 说说你知道的学历厂 #
58369次浏览 351人参与
# 秋招最大的收获是什么? #
36868次浏览 311人参与
# 找工作时的取与舍 #
80011次浏览 566人参与
# 你认为小厂实习有用吗? #
29307次浏览 341人参与
# 哪一瞬间觉得自己长大了 #
13901次浏览 327人参与