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/

 

不清楚代码里面为什么还要i =l(是L不是1)

i=l;
for(auto x:temp)
  nums[i++]=x;

 这里可以替换成

 for (int k = 0; k < temp.size(); k++)
      nums[l + k] = temp[k];
 return res;

 

注意nums的左边界不是从0开始的,而是从l(L)开始的

 

posted @ 2020-02-19 21:25  靖愁  阅读(165)  评论(0编辑  收藏  举报