65.数组中的逆序对 (难点在知道归并排序)

归并排序算法模板

关于代码中mid-i+1的解释:

[剑指offer 51] 数组中的逆序对

视频:AcWing 65. 数组中的逆序对

代码:

class Solution {
public: 
    int merge(vector<int> &nums,int l,int r)
    {
        if(l>=r) return 0; //只有一个元素
        int mid=(l+r)>>1; //二分
        int res=merge(nums,l,mid)+merge(nums,mid+1,r); //计算左右两个区间中的逆序对
        int i=l,j=mid+1; //定义两个指针
        vector<int> temp;
        while(i<=mid&&j<=r) //归并
        {
            if(nums[i]<nums[j]) temp.push_back(nums[i++]);
            else
            {
                temp.push_back(nums[j++]); //后面的元素小于前面的元素
                res+=mid-i+1;
            }
        }
        //无论是i或者是j,元素都比之前的数组要大,所以不可能存在新的逆序,把数组填好就可以了
        while(i<=mid) temp.push_back(nums[i++]); 
        while(j<=r) temp.push_back(nums[j++]);
// 将排好序的临时数组的元素复制回原数组 i
=l; for(auto x:temp) nums[i++]=x; return res; } int inversePairs(vector<int>& nums) { return merge(nums,0,nums.size()-1); } }; 作者:季科 链接:https://www.acwing.com/solution/acwing/content/2085/

猜你喜欢

转载自www.cnblogs.com/make-big-money/p/12333288.html