关注
第四题代码,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
*/
查看原帖
点赞 评论
相关推荐
查看6道真题和解析 点赞 评论 收藏
分享
小浪_Coding:你问别人,本来就是有求于人,别人肯定没有义务免费回答你丫, 有点流量每天私信可能都十几,几十条的,大家都有工作和自己的事情, 付费也是正常的, 就像你请别人搭把手, 总得给人家买瓶水喝吧 点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 我是面试官,请用一句话让我破防 #
16084次浏览 100人参与
# 美团开奖 #
183385次浏览 969人参与
# 快手技术岗信息交流阵地 #
15754次浏览 82人参与
# 校招生月薪1W算什么水平 #
15354次浏览 112人参与
# 中美关税战对我们有哪些影响 #
37793次浏览 306人参与
# i人适合做什么工作 #
7923次浏览 81人参与
# “vivo”个offer #
33007次浏览 247人参与
# 读研or工作,哪个性价比更高? #
75241次浏览 762人参与
# 华为保温 #
102426次浏览 383人参与
# 哪些瞬间让你真切感受到了工作的乐趣 #
17214次浏览 79人参与
# 小厂实习有必要去吗 #
69916次浏览 344人参与
# 哪些行业值得去? #
2907次浏览 40人参与
# 秋招什么时候开投比较合适? #
109837次浏览 807人参与
# 如果秋招能重来,我会____ #
29650次浏览 255人参与
# 华为池子有多大 #
107479次浏览 748人参与
# 美团求职进展汇总 #
2806064次浏览 23836人参与
# 上班后和你想的一样吗? #
87487次浏览 666人参与
# 苦尽甘来时,再讲来时路 #
26312次浏览 359人参与
# 为了实习逃课值吗? #
23194次浏览 214人参与
# 大家实习每天都在干啥 #
97135次浏览 536人参与
# 工作压力大怎么缓解 #
119689次浏览 1112人参与
# 如果上班像打游戏,你最想解锁什么技能 #
5627次浏览 55人参与
