一、逆序对的数量
1、题目描述
给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。
逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。
输入格式
第一行包含整数n,表示数列的长度。
第二行包含 n 个整数,表示整个数列。
输出格式
输出一个整数,表示逆序对的个数。
数据范围
1≤n≤1000001≤n≤100000
输入样例:
6 2 3 4 5 6 1
输出样例:
5
2、分析
可以借助归并排序的过程;
另,此题数据范围大,时间复杂度最坏为O(n^2),应该使用long类型来存储。
3、代码
import java.util.*;
import java.io.*;
public class Main{
static int N = (int)1e5 + 10;
static int[] arr = new int[N];
static long res;
static long mergeSort(int l, int r) {
if(l >= r) return 0;
int mid = l + r >> 1;
res = mergeSort(l, mid) + mergeSort(mid + 1, r);
int i = l,j = mid + 1,k = 0;
int[] tmp = new int[r - l + 1]; //注意:这里必须为 r-l+1,否则TLE
while(i <= mid && j <= r) {
if(arr[i] > arr[j]) {
res += mid - i + 1;
tmp[k ++] = arr[j ++];
}else {
tmp[k ++] = arr[i ++];
}
}
while(i <= mid) tmp[k ++] = arr[i ++];
while(j <= r) tmp[k ++] = arr[j ++];
for(int p = 0,q = l;q <= r;p ++,q ++) {
arr[q] = tmp[p];
}
return res;
}
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] line_arr = br.readLine().split(" ");
for(int i = 0;i < n;i ++) {
arr[i] = Integer.parseInt(line_arr[i]);
}
res = mergeSort(0, n - 1);
System.out.println(res);
br.close();
}
}
二、LeetCode 剑指 Offer 51. 数组中的逆序对 数组中的逆序对 LCOF
链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/
代码:
class Solution {
public int reversePairs(int[] nums) {
if(nums == null || nums.length == 0) return 0;
int out = mergeSort(nums, 0, nums.length - 1);
return out;
}
int mergeSort(int[] nums, int l, int r) {
if(l >= r) return 0;
int mid = l + r >> 1;
int res = mergeSort(nums, l, mid) + mergeSort(nums, mid + 1, r);
int[] tmp = new int[r - l + 1]; //这里必须写:r - l + 1,否则超时
int i = l, j = mid + 1, k = 0;
while(i <= mid && j <= r) {
if(nums[i] <= nums[j]) tmp[k ++] = nums[i ++];
else {
res += mid - i + 1;
tmp[k ++] = nums[j ++];
}
}
while(i <= mid) tmp[k ++] = nums[i ++];
while(j <= r) tmp[k ++] = nums[j ++];
for(int p = l,q = 0;p <= r; p ++,q ++) nums[p] = tmp[q];
return res;
}
}