1 逆序对
首先看一下逆序对(Leetcode 剑指offer 51):
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个
逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
限制:
0 <= 数组长度 <= 50000
这也是一个经典问题,而且如果方向没对的话,是想破头也想不出来的。肯定不能暴力搜索,会TLE。
怎么解决这个问题呢?我们先看一下归并排序。
2 归并排序
给定一个整数数组 nums,将该数组升序排列。
示例 1:
输入:[5,2,3,1]
输出:[1,2,3,5]
示例 2:
输入:[5,1,1,2,0,0]
输出:[0,0,1,1,2,5]
提示:
1 <= A.length <= 10000
-50000 <= A[i] <= 50000
排序算法千千万,这次我们用归并排序来解决。
class Solution
{
public:
vector<int> sortArray(vector<int>& nums)
{
mergeSort(nums, 0, nums.size() - 1);
return nums;
}
void mergeSort(vector<int>& nums, int p, int r)
{
if (p < r)
{
int q = (p + r) / 2;
mergeSort(nums, p, q);
mergeSort(nums, q + 1, r);
merge(nums, p, q, r);
}
}
void merge(vector<int>& nums, int p, int q, int r)
{
vector<int> nums1(nums.begin() + p, nums.begin() + q + 1),
nums2(nums.begin() + q + 1, nums.begin() + r + 1);
nums1.push_back(INT_MAX);
nums2.push_back(INT_MAX);
for (int i = 0, j = 0, k = p; k <= r; ++k)