788.逆序對的數量
阿新 • • 發佈:2020-10-09
給定一個長度為n的整數數列,請你計算數列中的逆序對的數量。
逆序對的定義如下:對於數列的第 i 個和第 j 個元素,如果滿足 i < j 且 a[i] > a[j],則其為一個逆序對;否則不是。
輸入格式
第一行包含整數n,表示數列的長度。
第二行包含 n 個整數,表示整個數列。
輸出格式
輸出一個整數,表示逆序對的個數。
資料範圍
1≤n≤100000
輸入樣例:
6
2 3 4 5 6 1
輸出樣例:
5
參考程式碼
import java.util.Scanner; public class Main { public static long mergeSort(int[] a, int l, int r) { if (l >= r) { return 0; } int mid = l + r >> 1; long res = mergeSort(a, l, mid) + mergeSort(a, mid + 1, r); int i = l, j = mid + 1, k = 0; int[] tmp = new int[r - l + 1]; while (i <= mid && j <= r) { if (a[i] <= a[j]) { tmp[k++] = a[i++]; } else { tmp[k++] = a[j++]; res += mid - i + 1; } } while (i <= mid) { tmp[k++] = a[i++]; } while (j <= r) { tmp[k++] = a[j++]; } for (i = l, j = 0; i <= r; i++, j++) { a[i] = tmp[j]; } return res; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] a = new int[n]; for (int i = 0; i < n; i++) { a[i] = sc.nextInt(); } System.out.println(mergeSort(a, 0, n - 1)); sc.close(); } }