首先,题目如下
如果假定一个有序一个无序,是不是就相当于求逆序对个数O(nlogn)
实现这个假定的时间复杂度是O(n)
做成字典
key为当前元素
value为当前元素之后的元素用hash保存
比如
第一个人的是
2:{3,4,1,5}
3:{4,1,5}
4:{1,5}
1:{5}
第二个人是
4:{2,1,3,5}
2:{1,3,5}
1:{3,5}
3:{5}
遍历某一个人的key,比如第一个人
第一个key是2找到对应的value,然后在第二个人字典中找到key为2的value,两个value求一下交集就是{1,3,5}
3的话是{5},4的话是{1,5},1的话是{5}
你们真厉害,我连题目都没看懂
根据采纳回答所提供的思路,将个人写得代码分享出来,供大家借鉴,实测可行(未考虑int越界等情况)
public class Main {
private static int[] arr1;
private static int count;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int length = input.nextInt();
arr1 = new int[length + 1];
int[] arr2 = new int[length];
for (int i = 0; i < length; ++i) {
arr1[input.nextInt()] = i;
}
for (int i = 0; i < length; ++i) {
arr2[i] = input.nextInt();
}
MergeSort(arr2, 0, length - 1);
int total = length * (length - 1) / 2;
System.out.println(count);
}
public static void MergeSort(int[] arr, int left, int right) {
if (left >= right) return;
int center = (right - left) / 2 + left;
MergeSort(arr, left, center);
MergeSort(arr, center + 1, right);
Merge(arr, left, center, right);
}
public static void Merge(int[] arr, int left, int center, int right) {
if (left >= right) return;
int[] temp = new int[right - left + 1];
int i = left;
int j = center + 1;
int k = 0;
while (i <= center && j <= right) {
if (arr1[arr[i]] > arr1[arr[j]]) {
temp[k++] = arr[j++];
++count;
} else {
if (i != center) count += j - center - 1;
temp[k++] = arr[i++];
}
}
int index = i;
while (i <= center) {
if (i != index) count += j - center - 1;
temp[k++] = arr[i++];
}
while (j <= right) {
temp[k++] = arr[j++];
}
for (int x = 0; x < temp.length; ++x) {
arr[x + left] = temp[x];
}
}
}