标签:面试题 LC idx nums int res fenwick 51 vector
Solution1 归并排序:
class Solution { public: int reversePairs(vector<int>& nums) { mergesort(nums,0,nums.size()-1); return res; } int res=0; void mergesort(vector<int>& nums, int left, int right){ if(left>=right) return; int mid=left+(right-left)/2; mergesort(nums,left,mid); mergesort(nums,mid+1,right); int j=mid+1; int i=left; vector<int> tmp; while(i<=mid && j<=right){ if(nums[i]<=nums[j]){ res+=j-1-(mid+1)+1; tmp.push_back(nums[i++]); }else{ tmp.push_back(nums[j++]); } } while(i<=mid){ res+=right-(mid+1)+1; tmp.push_back(nums[i++]); } while(j<=right){ tmp.push_back(nums[j++]); } for(int i=left;i<=right;i++){ nums[i]=tmp[i-left]; } } };
Solution2 FenwickTree:
class Solution { public: struct Number{ int index; int num; }; int reversePairs(vector<int>& nums) { int n=nums.size(); vector<Number> vs; for(int i=0;i<n;i++){ vs.push_back({i,nums[i]}); } sort(vs.begin(),vs.end(),[](Number n1, Number n2){ return n1.num<n2.num; }); vector<int> rank(n); int rk=0; int pre=INT_MIN; for(int i=0;i<n;i++){ if(vs[i].num==pre) rank[vs[i].index]=rk; else { rank[vs[i].index]=i+1; rk=i+1; } pre=vs[i].num; } vector<int> fenwick(n+1); int res=0; for(int i=n-1;i>=0;i--){ if(rank[i]!=1){ res+=find(fenwick,rank[i]-1); } update(fenwick,rank[i]); } return res; } void update(vector<int>& fenwick, int idx){ while(idx<=fenwick.size()-1){ fenwick[idx]+=1; idx+=(idx&-idx); } } int find(vector<int>& fenwick, int idx){ int res=0; while(idx>=1){ res+=fenwick[idx]; idx-=(idx&-idx); } return res; } };
标签:面试题,LC,idx,nums,int,res,fenwick,51,vector 来源: https://www.cnblogs.com/FEIIEF/p/12766720.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。