#532 Reverse Pairs

来源:互联网 发布:大麦盒子安装软件 编辑:程序博客网 时间:2024/06/05 15:51

题目描述:

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

Tags 
Array Merge Sort
题目思路:

这题没有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;    }};


0 0
原创粉丝点击