troysps 2020-04-26
leetcode 面试题51. 数组中的逆序对
本质上就是归并排序,并在合并区间过程中统计交换的逆序对的数目
归并排序需要开o(n)的辅助空间
class Solution { public: int deal(vector<int>&nums,vector<int>&tmp,int ll,int rr) { if(ll>=rr)//返回条件 return 0; int mid=ll+(rr-ll)/2; int count=deal(nums,tmp,ll,mid)+deal(nums,tmp,mid+1,rr); if(nums[mid]<nums[mid+1])//已经有序不需要再比了 return count; int x=ll,y=mid+1,i; for(i=0;x<=mid&&y<=rr;i++)//合并两个数组到新的数组 { if(nums[x]<=nums[y]) { tmp[i]=nums[x]; x++; } else { tmp[i]=nums[y]; y++; count+=(mid-x+1); } } for(;x<=mid;x++) { tmp[i]=nums[x]; i++; } for(;y<=rr;y++) { tmp[i]=nums[y]; i++; } int yy=ll; for(int k=0;k<i;k++) { nums[yy]=tmp[k]; yy++; } return count; } int reversePairs(vector<int>& nums) { int size=nums.size(); if(size<2) return 0; vector<int>tmp(size,0); return deal(nums,tmp,0,size-1); } };
排序是将一串数据按照其某个或者某些关键字的大小进行递增或递减排列的操作我,通常指的排序是升序,排序方式是原地排序。即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并