首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >分治-归并排序-逆序对问题

分治-归并排序-逆序对问题

作者头像
猫咪-9527
发布2025-04-06 21:13:19
发布2025-04-06 21:13:19
10900
代码可运行
举报
文章被收录于专栏:猫咪-9527猫咪-9527
运行总次数:0
代码可运行
1.升序(以右边的合并组为基准)

找出左边有多少个数比我(nums[right])大

  • 应该在每一次合并之前,进行逆序对查找
  • 每一个该合并的组都是按升序排列,所以当nums[left]<nums[right]时,应该left++,因为都是升序,所以当nums[left]>nums[right],right++时,left从当前位置不动。
代码语言:javascript
代码运行次数:0
运行
复制
class Solution {
public:
    vector<int> ret;
    int vim=0;
    int reversePairs(vector<int>& record) {
        ret.resize(record.size());
        mergesort(record,0,record.size()-1);
        return vim;
    }
    void merge(vector<int>&nums,int low,int high,int mid)
    {
        int left=low,right=mid+1, i=0;
        while(left<=mid&&right<=high)
        {
             if(nums[left]<=nums[right]) ret[i++]=nums[left++];
            else  
            {
                ret[i++]=nums[right++];
                vim+=(mid+1-left);
            }
        }
        while(left<=mid) ret[i++]=nums[left++];
        while(right<=high) ret[i++]=nums[right++];
        for(int i=0;i<high-low+1;i++)
        {
            nums[i+low]=ret[i];
        }
    }
    void mergesort(vector<int>&nums,int low,int high)
    {
        if(low>=high) return;
        int mid=(low+high)/2;
        mergesort(nums,low,mid);
        mergesort(nums,mid+1,high);
        merge(nums,low,high,mid);
        
    }
};
2.降序(以左边的合并组为基准)

 找出多少个数比我小

 合并过程:

代码语言:javascript
代码运行次数:0
运行
复制
class Solution {
public:
    vector<int> ret;
    int vim=0;
    int reversePairs(vector<int>& record) {
        ret.resize(record.size());
        mergesort(record,0,record.size()-1);
        return vim;
    }
    void merge(vector<int>&nums,int low,int high,int mid)
    {
        int left=low,right=mid+1, i=0;
        while(left<=mid&&right<=high)
        {
             if(nums[left]>nums[right]) 
             {
                vim+=(high-right+1);
                ret[i++]=nums[left++];
             }
            else  
            {
                ret[i++]=nums[right++];
            }
        }
        while(left<=mid) ret[i++]=nums[left++];
        while(right<=high) ret[i++]=nums[right++];
        for(int i=0;i<high-low+1;i++)
        {
            nums[i+low]=ret[i];
        }
    }
    void mergesort(vector<int>&nums,int low,int high)
    {
        if(low>=high) return;
        int mid=(low+high)/2;
        mergesort(nums,low,mid);
        mergesort(nums,mid+1,high);
        merge(nums,low,high,mid);
        
    }
};

 对比:

降序升序 void merge(vector<int>&nums,int low,int high,int mid)     {         int left=low,right=mid+1, i=0;         while(left<=mid&&right<=high)         {  if(nums[left]>nums[right])               {                 vim+=(high-right+1);                 ret[i++]=nums[left++];              }             else                ret[i++]=nums[right++]; }         while(left<=mid) ret[i++]=nums[left++];         while(right<=high) ret[i++]=nums[right++];         for(int i=0;i<high-low+1;i++)         {             nums[i+low]=ret[i];         }     }  void merge(vector<int>&nums,int low,int high,int mid)     {         int left=low,right=mid+1, i=0;         while(left<=mid&&right<=high)         {  if(nums[left]<=nums[right])                 ret[i++]=nums[left++];             else               {                 ret[i++]=nums[right++];                 vim+=(mid+1-left);             }         }         while(left<=mid) ret[i++]=nums[left++];         while(right<=high) ret[i++]=nums[right++];         for(int i=0;i<high-low+1;i++)         {             nums[i+low]=ret[i];         }     }

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.升序(以右边的合并组为基准)
  • 2.降序(以左边的合并组为基准)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档