【剑指offer】5.3时间效率与空间效率的平衡——面试题36:数组中的逆序对

来源:互联网 发布:淘宝网夏季女装上衣 编辑:程序博客网 时间:2024/05/22 02:20

树状数组的思想,不过会受到N的影响,扩展离散+树状数组(树状数组相关内容参考http://blog.csdn.net/shahdza/article/details/6314818)

//题目描述//在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。#include<iostream>#include<vector>using namespace std;const int N=100005;class Solution {public:    int InversePairs(vector<int> data) {       int n=data.size();   if(n==0)return 0;   int cnt=0;   for(int i=1;i<=n;i++){   cnt+=i-getSum(data[i-1])-1;   update(data[i-1],1);   }   return cnt;    }private:int lowbit(int x){return x&(-x);}void update(int x,int val){while(x<N){d[x]+=val;x+=lowbit(x);}}int getSum(int n){int s=0;while(n){s+=d[n];n-=lowbit(n);}return s;}private:int d[N]={0};};int main(){Solution test=Solution();vector<int>v;int n;cin>>n;for(int i=0;i<n;i++){int tmp;cin>>tmp;v.push_back(tmp);}cout<<test.InversePairs(v)<<endl;return 0;}


0 0
原创粉丝点击