题解 | #数组中的逆序对#
数组中的逆序对
https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5
class BIT{ private: vector<int> tree; int m; public: BIT(int n):m(n), tree(n + 1){} int lowbit(int x){ return x & (-x); } void update(int x){ while(x <= m){ tree[x]++; x += lowbit(x); } } int query(int x){ int res = 0; while(x){ res += tree[x]; x -= lowbit(x); } return res; } }; class Solution { public: /** * @param nums int整型vector * @return int整型 */ int serch(vector<int> nums,int target){ int left = 0; int right = nums.size() - 1; while(left <= right){ auto mid = (left + right) / 2; if(nums[mid] == target){ return mid; }else if(nums[mid] < target){ left = mid + 1; }else{ right = mid - 1; } } return -1; } int InversePairs(vector<int>& nums) { // write code here| vector<int> temp = nums; int mod = 1000000007; int n = nums.size(); sort(temp.begin(), temp.end()); for(int i = 0; i < n; ++i){ nums[i] = serch(temp, nums[i]) + 1; } BIT bit(n); int res = 0; for(int i = 0; i < n; ++i){ res = (res + bit.query(n) - bit.query(nums[i]) )% mod; //查询大于他的一共有多少个数 bit.update(nums[i]);// 看哪个位置有数 } return res; } };