赞
踩
class Solution { public: // 将count声明为public vector<int> count; vector<int> indexs,tmp; public: vector<int> countSmaller(vector<int>& nums) { //归并 int left=0; int right=nums.size()-1; //计数 // vector<int> count(nums.size()); count=vector<int>(nums.size()); for(int i=0;i<nums.size();i++){ count[i]=0; } //index // vector<int> indexs(nums.size()); indexs=vector<int>(nums.size()); for(int i=0;i<nums.size();i++){ indexs[i]=i; } tmp=vector<int>(nums.size()); mergeSort(left,right,nums); // vector<int> counts; // for(int i=0;i<nums.size();i++) // counts.push_back(n[nums_copy[i]]); return count; } void mergeSort(int left,int right,vector<int>& nums){ if(left>=right) return ; int mid=left+(right-left)/2; mergeSort(left,mid,nums); mergeSort(mid+1,right,nums); merge(left,right,nums); } void merge(int left,int right,vector<int>& nums){ int mid=left+(right-left)/2; int i=left; int j=mid+1; // vector<int> tmp; int k=0; while(i<=mid && j<=right){ if(nums[indexs[i]]>nums[indexs[j]]){ count[indexs[i]]+=(right-j)+1; tmp[k++]=indexs[i++]; } else{ tmp[k++]=indexs[j++]; } } while(i<=mid){ tmp[k++]=indexs[i++]; } while(j<=right){ tmp[k++]=indexs[j++]; } for(int i=0;i<k;i++){ indexs[left+i]=tmp[i]; } // tmp.clear(); } };
Focus:
1 (int left,int right,vector& nums) &没有用取址符会超出内存
2 点在于indexs 按index顺序归并,比较按里面元素
3 tmp index count
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。