剑指offer:
题目:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
思路:
复用归并排序,在合并排序时稍加修改
代码:
class Solution {
public:
int InversePairs(vector<int> &data) {
if(data.empty())
{
return 0;
}
m_res = 0;
merge_sort(data, 0, data.size()-1);
return m_res%1000000007;
}
void merge_sort(vector<int> &nums, int start, int end)
{
if(start >= end)
{
return;
}
int middle = start + (end - start)/2;
merge_sort(nums, start, middle);
merge_sort(nums, middle+1, end);
merge(nums, start, end, middle);
}
void merge(vector<int> &nums, int start, int end, int middle)
{
int left_index = start;
int right_index = middle+1;
vector<int> nums_tmp;
while(left_index <= middle || right_index <= end)
{
if(right_index > end || (left_index <= middle && nums[left_index] < nums[right_index]) )
{
nums_tmp.push_back(nums[left_index++]);
}
else
{
nums_tmp.push_back(nums[right_index++]);
m_res += (middle - left_index + 1);
}
}
swap_ranges(nums.begin() + start, nums.begin() + end + 1, nums_tmp.begin());
}
long m_res;
};