剑指 Offer 51. 数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
代码:
class Solution { public: int a[50005]; int res=0; void merge(vector<int>& nums,int l,int mid, int r) // 这里必须加上取地址符号!!!! { int i=l; int j=mid+1; int pos=l; while(i<=mid && j<=r) { if(nums[i]<=nums[j]) { a[pos++]=nums[i++]; //res+=(j-(mid+1)); // 如果选择从左边计算,后面还需要加上 } else { a[pos++]=nums[j++]; res+=(mid-i+1); // 选择右边计算就不用加,因为不存在逆序对了 } } while(i<=mid) { a[pos++]=nums[i++]; // res+=(j-(mid+1)); } while(j<=r) a[pos++]=nums[j++]; for(int i=l;i<=r;i++) nums[i]=a[i]; return; } void split(vector<int>& nums, int l,int r) // 这里必须加上取地址符号!!!! { if(l>=r) return; int mid=l+(r-l)/2; // int mid=(l+r)/2; // 这两句都可以。 split(nums,l,mid); split(nums,mid+1,r); merge(nums,l,mid,r); //return; } int reversePairs(vector<int>& nums) { split(nums,0,nums.size()-1); return res; } };