Reverse Pairs

public class Solution {
    /**
     * @param A: an array
     * @return: total of reverse pairs
     */
		public long reversePairs(int[] A) {
			return mergeSort(A, 0, A.length - 1);
		}
		//mergeSort模版
		private int mergeSort(int[] nums, int left, int right) {
			if (left >= right) { //递归退出条件
				return 0;
			}
			int mid = left + (right - left) / 2;
			int res = mergeSort(nums, left, mid) + mergeSort(nums, mid + 1, right);
			res += merge(nums, left, right, mid); //先加左右结果,再加本层merge的结果
			return res;
		}
		//利用 mergeSort中 merge的步骤特性,来计算逆序对的数量
		private int merge(int[] nums, int left, int right, int mid) {
			int res = 0;
			int[] merged = new int[right - left + 1]; //临时数组
			int i = left, j = mid + 1, index = 0; //临时数组的指针
			while (i <= mid && j <= right) {
				if (nums[i] <= nums[j]) {
				merged[index++] = nums[i++];
				} else {
					merged[index++] = nums[j++];
					//calculus res 
					res += mid - i + 1; //这个 j 可以和左边的所有数字都成逆序对
				}
			}
			while (i <= mid) {
				merged[index++] = nums[i++];
			}
			while (j <= right) {
				merged[index++] = nums[j++];
			}
			for (i = left, index = 0; i <= right; i++, index++) {
				nums[i] = merged[index]; //排好序的数组就不会
			}
			return res;
		} 	
}

最后更新于

这有帮助吗?