题目:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/
AC代码
class Solution {
private:
int ans = 0;
public:
void merge_sort(int l, int r, vector<int>& nums, vector<int> &temp){
if(l == r) return ;
int mid = l + (r - l) / 2;
int i = l, j = mid + 1, k = l;
merge_sort(l, mid, nums, temp);
merge_sort(mid + 1, r, nums, temp);
while(i <= mid && j <= r)
{
if(nums[i] <= nums[j])
temp[k++] = nums[i++];
else
{
temp[k++] = nums[j++];
ans += mid - i + 1;
}
}
while(i <= mid)
temp[k++] = nums[i++];
while(j <= r)
temp[k++] = nums[j++];
for(int u = l; u <= r; u++)
nums[u] = temp[u];
}
int reversePairs(vector<int>& nums) {
if(nums.empty()) // 输入为空时
ans = 0;
else
{
vector<int> temp(nums.size(), 0);
merge_sort(0, nums.size() - 1, nums, temp);
}
return ans;
}
};
#include<iostream>
#include<cstdio>
#include<vector>
#include<sstream>
using namespace std;
class solution
{
private:
int n;
int ans = 0;
public:
void set_nums(int num, vector<int>& nums)
{
n = num;
printf("请输入%d个数:", n);
for(int i = 1; i<= num; i++)
{
int x;
cin >> x;
nums.push_back(x);
}
}
void mergesort(int l, int r, vector<int>& nums, vector<int>& temp)
{
if(l == r) return ;
int mid = l + (r - l)/ 2;
mergesort(l, mid, nums, temp);
mergesort(mid + 1, r, nums, temp);
int i = l, j = mid + 1, k = l;
while(i <= mid && j <= r)
{
if(nums[i] <= nums[j])
temp[k++] = nums[i++];
else
{
temp[k++] = nums[j++];
ans += mid - i + 1;
}
}
while(i <= mid)
temp[k++] = nums[i++];
while(j <= r)
temp[k++] = nums[j++];
for(int u = l; u <= r; u++)
nums[u] = temp[u];
}
int reversePairs(int n, vector<int>& nums)
{
set_nums(n, nums);
vector<int> temp(nums.size(), 0);
mergesort(0, nums.size() - 1, nums, temp);
return ans;
}
};
int main()
{
solution test;
int n;
printf("请输入n:");
cin >> n;
vector<int> nums;
int res = test.reversePairs(n, nums);
cout << res << endl;
return 0;
}