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


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);
}
};找出多少个数比我小

合并过程:

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]; } }