剑指offer:数组中的逆排序
整体思想用的是归并排序,分两部分,右边第一个数看左边的数谁比它大就是逆排序,省的一个个比较了,把右边都走一遍
定义个数组nums,左右边界,左大于右输出零;取个中间值mid,把左右两边都进行归并,逆序数对++,用了一个缓存数组存放两个子数组中最小元素比较的最小进行存储,最后是已经从小到大排序好的。
#define MODNUM 1000000007 class Solution{ public: int InversePairs(vector<int> data){ return mergeSort(data , 0, data.size()-1); } int mergeSort(vector<int>& nums,int left,int right){ if(left>=right) return 0; int mid = left+(right-left)/2; int count = mergeSort(nums, left, mid) + mergeSort( nums, mid+1, right); vector<int> cache(right-left+1); int i = left,j=mid+1,k=0; while(i<=mid and j<=right){ if(nums[i]<=nums[j]){ cache[k++] = nums[i++]; }else{ count =(count+mid-i+1)%1000000007; cache[k++] = nums[j++]; } } while(i<=mid) cache[k++] = nums[i++]; while(j<=right) cache[k++] = nums[j++]; for(int i =left,k=0;i<=right;i++,k++){ nums[i]=cache[k]; } return count; } };#剑指offer##23届找工作求助阵地#