数组中的逆序对

题目描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 完全不知道为什么正在VS上测试可以,在牛客网上测试只有50%好吧不想管了就这样吧

#include <iostream>
#include <stdio.h>
#include<vector>
using namespace std;
 int merge( vector<int> &data,int start,int mid,int end,vector<int>& temp)//传递地址变量
        {
         
         int i=start,j=mid+1;
         int k=start;
long count=0;
        
           while(i<=mid&&j<=end) 
               {
               if(data[i]>data[j])
                   {
                   temp[k++]=data[i++];
                   count+=end-j+1;
                   
                  }
               
               else
                   temp[k++]=data[j++];
               }
            while(i<=mid)
                temp[k++]=data[i++];
            while(j<=end)
                temp[k++]=data[j++];
            for(int m=start;m<=end;m++)
                data[m]=temp[m];
       
           return count;
        
        }
 int inverse(vector<int> &data,int start,int end,vector<int>& temp)
        {
        long count=0;
        if(start<end)
            {
            int mid=(start+end)/2;
            count+=inverse(data,start,mid,temp);
            count+=inverse(data,mid+1,end,temp);
            count+=merge(data,start,mid,end,temp);
            
            
             }
        return count;
        
         }
 int InversePairs(vector<int> &data) 
    {
      
        vector<int> temp(data.begin(), data.end());
        int len=data.size();
        if(len<=0) return 0;
        long count=inverse(data,0,len-1,temp);
        return count;
    }
   
   
int main() 
{
  
       // int len=sizeof(data)/sizeof(int);
 int N;
     cin >> N;
 
     vector< int> data(N, 0);
     for (int i = 0; i < N; ++i)
     {
         cin >> data[i];
     }
 
    int count= InversePairs(data);
     cout << count << endl;
     return 0;


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值