leetcode 315 计算右侧小于当前元素的个数
一、题目描述
二、解题思路
采用归并排序的思路可以解决这个问题,本题思路与寻找逆序对的思路一致。
leetcode LCR 170.交易逆序对的总数-CSDN博客
由于需要记录每一个数字的对应下标,所以我们需要数组Index来对应记录,保证Index数组和nums数组同步变化,就可以不丢失每一个数组的真正下标。
三、代码实现
时间复杂度:T(n)=O(nlogn)
空间复杂度:S(n)=O(n)
class Solution {vector<int> ret;vector<int> Index;vector<int> Numstmp;vector<int> Indextmp;
public:vector<int> countSmaller(vector<int>& nums) {int n=nums.size();ret.resize(n,0);Index.resize(n,0);Numstmp.resize(n);Indextmp.resize(n);//Index用于记录对应数字的下标for(int i=0;i!=n;i++)Index[i]=i;mergeSort(nums,0,n-1);return ret;}void mergeSort(vector<int>& nums,int left,int right){//递归出口if(left>=right) return;//1.寻找中间位置int mid=left+(right-left)/2;//2.处理左区间、处理右区间mergeSort(nums,left,mid);mergeSort(nums,mid+1,right);//3.一左一右处理int cur1=left,cur2=mid+1,i=0;while(cur1<=mid&&cur2<=right){if(nums[cur1]<=nums[cur2]){Numstmp[i]=nums[cur2];Indextmp[i++]=Index[cur2++];}else{ret[Index[cur1]]+=right-cur2+1;Numstmp[i]=nums[cur1];Indextmp[i++]=Index[cur1++];}}//4.处理未归并的部分while(cur1<=mid){Numstmp[i]=nums[cur1];Indextmp[i++]=Index[cur1++];}while(cur2<=right){Numstmp[i]=nums[cur2];Indextmp[i++]=Index[cur2++];}//5.还原数组for(int i=left;i<=right;i++){nums[i]=Numstmp[i-left];Index[i]=Indextmp[i-left];}}
};