赞
踩
用map记录以及离散化都是为了应对出现负数的情况,更新树状数组的时候因为是严格小于,所以更新的时候得加1。
class Solution { int len; vector<int> arr; public: void update(int n,int k){ for(int i = n;i <= len;i += (i)&(-i)) arr[i] += k; } int getnum(int n){ int sum = 0; for(int i = n;i >= 1;i -= (i)&(-i)){ sum += arr[i]; } return sum; } //离散化 void discrete(vector<int> nums,map<int,int>& dis){ sort(nums.begin(),nums.end()); for(int i = 0;i < nums.size();i++){ dis[nums[i]] = i+1; } } vector<int> countSmaller(vector<int>& nums) { len = nums.size(); vector<int> res(len,0); if(!len) return {}; map<int,int> dis; arr.resize(len+1,0); discrete(nums,dis); for(int i = len-1;i >= 0;i--){ res[i] = getnum(dis[nums[i]]); update(dis[nums[i]]+1,1); } return res; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。