关注
第四题代码,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
*/
查看原帖
点赞 评论
相关推荐
10-18 13:02
西安理工大学 C++ 点赞 评论 收藏
分享
牛客热帖
正在热议
# 25届秋招总结 #
323860次浏览 3014人参与
# 上班苦还是上学苦呢? #
70255次浏览 627人参与
# 阿里云管培生offer #
36511次浏览 421人参与
# 地方国企笔面经互助 #
4422次浏览 12人参与
# 如果有时光机,你最想去到哪个年纪? #
20890次浏览 373人参与
# 选完offer后,你后悔学本专业吗 #
21627次浏览 158人参与
# 百度开奖 #
180892次浏览 1132人参与
# 我的实习求职记录 #
6067980次浏览 83523人参与
# 如何一边实习一边秋招 #
996100次浏览 12661人参与
# 入职第一天,你准备什么时候下班 #
21520次浏览 144人参与
# 招聘要求与实际实习内容不符怎么办 #
10697次浏览 276人参与
# bilibili求职进展汇总 #
32960次浏览 354人参与
# 许愿池 #
214601次浏览 2534人参与
# 学历or实习经历,哪个更重要 #
53625次浏览 419人参与
# 实习工作,你找得还顺利吗? #
247606次浏览 2905人参与
# 海康威视求职进展汇总 #
400467次浏览 3408人参与
# 通信硬件薪资爆料 #
608001次浏览 5154人参与
# 携程求职进展汇总 #
135455次浏览 928人参与
# 正在实习的你,几点下班 #
53031次浏览 395人参与
# 工作两年想退休了 #
53002次浏览 672人参与
# 如果再来一次,你还会学硬件吗 #
95126次浏览 1169人参与
# 软件开发薪资爆料 #
2194032次浏览 21881人参与