leetcode 493

跟经典的逆序对问题没有什么区别, 首先考虑对数组前半部和后半部求逆序对数,若能保证两段数组都有序,则显然可以在线性时间内求出对数。

所以我们采用归并排序的方法,一方面让数组有序,另一方面计算子数组的逆序对数。

代码实现有些细节要注意,在比较时需要把Int转换为longlongint 不然会出错。

class Solution {
public:
    int reversePairs(vector<int>& nums) {
       int ans=0;
 if(nums.size()<2)return ans;  
 if(nums.size()==2) 
 {
 if ((long long)nums[0]>(long long )nums[1]*2)ans=1;
 if((long long)nums[0]<(long long)nums[1]){int t=nums[0];nums[0]=nums[1];nums[1]=t;}
 return ans;
 }
 vector<int>left,right;
 int i;
 for(i=0;i<nums.size()/2;i++)
 	left.push_back(nums[i]);
 for(;i<nums.size();i++)
 	 right.push_back(nums[i]);
 ans+=reversePairs(left);ans+=reversePairs(right);
 int j=0,tot=0;
 i=0;
 while(i<left.size()&&j<right.size()) 
 	{
 	 if((long long)left[i]>(long long)right[j]*2){i++;ans+=right.size()-j;}
 	      else j++;
	}  
 i=j=0;
 while(i<left.size()&&j<right.size()) 
 	{
 	 if(left[i]>right[j])nums[tot++]=left[i++];
 	 	else nums[tot++]=right[j++];
	} 
 while(i<left.size())
 	nums[tot++]=left[i++];
 while(j<right.size())
 	nums[tot++]=right[j++];
 return ans;
        
    }
};

  

posted on 2017-03-04 00:59  Bingsen  阅读(203)  评论(0编辑  收藏  举报