题目描述:
For an array A, if i < j, and A [i] > A [j], called (A [i], A [j]) is a reverse pair.
return total of reverse pairs in A.
Example
题目思路:
Given A = [2, 4, 1, 3, 5]
, (2, 1), (4, 1), (4, 3)
are reverse pairs. return 3
这题没有merge sort的提示我还真是想不出来,主要是利用了merge sort在merge two sorted array的过程中,会发现reverse pair的关系,然后利用这个来进行计算。code部分和merge sort非常类似,只是merge和mergeSort函数返回的都是reverse pair count。在merge两个sorted array时,如果发现了tmp[l] > tmp[r]的关系,那么l和它之后的所有数都比tmp[r]大,所以count上加的number是l(包括l)之后数字个数的总和。
Mycode(AC = 82ms):
class Solution {
public:
/**
* @param A an array
* @return total of reverse pairs
*/
long long reversePairs(vector<int>& A) {
// Write your code here
return mergeSort(A, 0, A.size() - 1);
}
long long mergeSort(vector<int>& A, int start, int end) {
if (start >= end) {
return 0;
}
long long left = mergeSort(A, start, (start + end) / 2);
long long right = mergeSort(A, 1 + (start + end) / 2, end);
return merge(A, start, (start + end) / 2 + 1, end) + left + right;
}
long long merge(vector<int>& A, int start, int mid, int end) {
if (start >= end) return 0;
// assign A values into tmp
vector<int> tmp(end - start + 1, 0);
int idx = 0;
for (int i = start; i <= end; i++) {
tmp[idx++] = A[i];
}
// merge 2 sorted arrays
int l = 0, r = mid - start;
long long count = 0;
idx = start;
while (l < mid - start && r < tmp.size()) {
if (tmp[l] <= tmp[r]) {
A[idx++] = tmp[l++];
}
else { // if tmp[l] > tmp[r], then there exists
// mid - start - l pairs (because all elements
// after l are also larger than tmp[r]).
A[idx++] = tmp[r++];
count += mid - start - l;
}
}
// put the rest of values into merged array
while (l < mid - start) {
A[idx++] = tmp[l++];
}
while (r < tmp.size()) {
A[idx++] = tmp[r++];
}
return count;
}
};