Pointing to Offer - Interview Question 36: Reverse Pairs in Arrays

Inverse pairs in an array


Question: Two numbers in an array form an inverse pair if the previous number is greater than the latter number. Given an array, find the total number of inverse pairs in the array. For example, there is an array Array[0..n] which has elements a[i], a[j]. If when i < j, a[i]>a[j], then we call (a[ i], a[j]) is an inverse pair. There are 5 reverse order pairs in the array {7,5,6,4}, which are (7,6),(7,5),(7,4),(6,4),(5,4) .

Input: {7,5,6,4}

output: 5

Ideas: 1. The main idea is to use merge sort, first divide the array into each array as a group;
2. Further, set 2 pointers, the P pointer points to the last element of the previous group, and the Q pointer points to the back The last element of a group, when merging, it is judged whether the last element of the previous group is greater than the last element of the latter group;
3. If it is greater, the number of reverse pairs should be added to all the elements in the latter group. 4. If it is less than or equal to, put the last element
of the latter group in the last element of the sorted array; in addition, move the pointer Q to the front.
5. Finally output the number of reverse order pairs

/*
实现:数组中的逆序对
*/

#include<iostream>
#include<vector>
using namespace std;

int inverseNumber = 0;

void mergeArray(vector<int>& a, int start, int mid, int end){
    vector<int> temp;
    temp.resize(end+1);
    int i = mid;
    int j = end;
    int index = end;
    while (i >= start&&j >= mid + 1){
        if (a[i] > a[j]){
            temp[index--] = a[i--];
            inverseNumber += j - mid;
        }
        else{
            temp[index--] = a[j--];
        }
    }
    while (i >= start){
        temp[index--] = a[i--];
    }
    while (j >= mid+1){
        temp[index--] = a[j--];
    }
    for (int k = start; k <= end; k++){
        a[k] = temp[k];
    }
}

void mergeSort(vector<int>& a, int start, int end){
    if (start < end){
        int mid = (start + end) / 2;
        mergeSort(a, start, mid);
        mergeSort(a, mid + 1, end);
        //对两个数组进行合并,这2个数组是start ~ mid 以及 mid+1 ~ end
        mergeArray(a, start, mid, end);
    }
}


int main(){
    vector<int> number;
    int temp;
    do{
        cin >> temp;
        number.push_back(temp);
    } while (cin.get() != '\n');

    mergeSort(number, 0, number.size()-1);
    for (int i = 0; i < number.size(); i++){
        cout << number[i] << " ";
    }
    cout << endl;
    cout << inverseNumber;
    system("pause");
    return 0;
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325492394&siteId=291194637