【发布时间】:2021-09-05 07:08:08
【问题描述】:
我试图解决这个问题,但我得到了错误的答案 反转计数:对于数组,反转计数表示数组距离排序的距离(或接近)。如果数组已经排序,则反转计数为 0。如果数组以相反的顺序排序,则反转计数为最大值。 形式上,如果 a[i] > a[j] 并且 i ,则两个元素 a[i] 和 a[j] 形成一个反转。
class Solution
{
// arr[]: Input Array
// N : Size of the Array arr[]
//Function to count inversions in the array.
static long count = 0;
static long inversionCount(long arr[], long n)
{
// Your Code Here
long merged[] = mergeSort(arr, 0, n - 1);
return count;
}
static long[] merge(long left[], long right[])
{
long res[] = new long[left.length + right.length];
long i = 0, j = 0, k = 0;
while (i < left.length && j < right.length)
{
if (left[(int)i] <= right[(int)j])
{
res[(int)k] = left[(int)i];
k++;
i++;
}
else
{
count = count + (left.length - i);
res[(int)k] = right[(int)j];
k++;
j++;
}
}
while (i < left.length)
{
res[(int)k] = left[(int)i];
i++;
k++;
}
while (j < right.length)
{
res[(int)k] = right[(int)j];
k++;
j++;
}
while (i < left.length)
{
res[(int)k] = left[(int)i];
i++;
k++;
}
return res;
}
static long[] mergeSort(long a[], long lo, long hi)
{
if (hi == lo)
{
long temp[] = {a[(int)hi], };
return temp;
}
long mid = (hi + lo) / 2;
long left[] = mergeSort(a, lo, mid);
long right[] = mergeSort(a, mid + 1, hi);
long merged[] = merge(left, right);
return merged;
}
}
【问题讨论】:
-
你的代码有什么问题?当你运行它时会发生什么,你期望会发生什么?有什么错误吗?见How to Ask。
-
请修剪您的代码,以便更容易找到您的问题。请按照以下指南创建minimal reproducible example。