• 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)开始的

    带女朋友搬家新家条件不好,累到女朋友了,让女朋友受苦了,特此明志:每天学习,明年这个时候(20190812)让女朋友住上大房子,永远年轻,永远热泪盈眶,很多人都是这样,他们都把自己当成身在梦中一样,浑浑噩噩地过日子,只有痛苦或爱或危险可以让他们重新感到这个世界的真实。
  • 相关阅读:
    2月1
    20220319 13:41:33
    88888
    Python窗口学习之使窗口变得更高清
    Oracle How To Query If A User Has Execute Privilege on DBMS_LOB
    flume 采集kafka数据到hdfs遇到的问题1
    每日博客
    每日博客
    每日博客
    每日博客
  • 原文地址:https://www.cnblogs.com/make-big-money/p/12333288.html
Copyright © 2020-2023  润新知