剑指OFFER
题目描述:在一个数组中,如果前一个数字大于后面的数字, 则这两个数字组成一个逆序对。输入一个数组,求该数组中逆序对的个数。
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
#include<climits>
#include<unordered_map>
using namespace std;
int reversePairs(vector<int>& nums, int left, int right, vector<int>& temp){
if(left >= right){
return 0;
}
int ans = 0, mid = (left + right) / 2;
ans += reversePairs(nums, left, mid, temp);
ans += reversePairs(nums, mid + 1, right, temp);
int i = left, j = mid + 1, k = 0;
while(i <= m && j <= right){
if(nums[i] <= nums[j]){
temp[k++] = nums[i++];
}else{
temp[k++] = nums[j++];
ans += mid - i + 1;
}
}
while(i <= m){
temp[k++] = nums[i++];
}
while(j <= right){
temp[k++] = nums[j++];
}
for(int i = left, k = 0; i <= right; i++){
nums[i] = temp[k++];
}
return ans;
}
int reversePairs(vector<int>& nums){
int n = nums.size();
if(n < 2){
return 0;
}
vector<int> temp(n, 0);
return reversePairs(nums, 0, n - 1, temp);
}
void utils(){
cout << "enter nums: ";
int val;
vector<int> nums;
cin >> val;
nums.push_back(val);
cout << "reversePairs: " << reversePairs(nums) << endl;
}
int main(){
utils();
return 0;
}