• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
村雨sup
自己选的路,跪着也要走完 XD
博客园    首页    新随笔    联系   管理    订阅  订阅
数组中的逆序对
 算法知识视频讲解
中等  通过率:16.27%  时间限制:3秒  空间限制:64M
 
知识点数组
  • 题目
  • 题解(42)
  • 讨论(850)
  • 排行

描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007

对于50\%50%的数据,size\leq 10^4size≤104
对于100\%100%的数据,size\leq 10^5size≤105

输入描述:

题目保证输入的数组中没有的相同的数字

示例1

输入:
[1,2,3,4,5,6,7,0]
返回值:
7
 
 
class Solution {
public:
    const int kmod = 1000000007;
    
    int InversePairs(vector<int> data) {
        int ret = 0;
        merge_sort(data,0,data.size()-1,ret);
        return ret;
    }
    
    void merge_sort(vector<int>&arr,int l,int r,int &ret){
        if(l >= r) return;
        
        int mid = l + ((r-l)>>1);
        merge_sort(arr, l, mid, ret);
        merge_sort(arr, mid+1, r, ret);
        merge_two(arr,l,mid,r,ret);
    }
    
    void merge_two(vector<int>&arr,int l,int mid,int r,int &ret){
        vector<int> temp(r-l+1);
        int i=l,j=mid+1,k=0;
        
        while(i <= mid && j <= r){
            if(arr[i] > arr[j]){
                temp[k++] = arr[j++];
                ret += (mid-i+1);
                ret %= kmod;
            }
            else{
                temp[k++] = arr[i++];
            }
        }
        while(i <= mid){
            temp[k++] = arr[i++];
        }
        while(j <= r){
            temp[k++] = arr[j++];
        }
        
        for(k=0,i=l;i <= r;++i,++k){
            arr[i] = temp[k];
        }
    }
};

_____________

如果两个区间为[4, 3] 和[1, 2]
那么逆序数为(4,1),(4,2),(3,1),(3,2),同样的如果区间变为有序,比如[3,4] 和 [1,2]的结果是一样的,也就是说区间有序和无序结果是一样的。
但是如果区间有序会有什么好处吗?当然,如果区间有序,比如[3,4] 和 [1,2]
如果3 > 1, 显然3后面的所有数都是大于1, 这里为 4 > 1, 明白其中的奥秘了吧。所以我们可以在合并的时候利用这个规则。

posted on 2021-07-13 11:31  村雨sup  阅读(53)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3