题解 | #数组中的逆序对#
数组中的逆序对
https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
int InversePairs(vector<int>& nums) {
const int threshold = 1000000007;
int n = nums.size();
int ret = 0;
//非递归形势将左右下标入栈,时间空间logn
stack<pair<int, int>> st;
stack<pair<int, int>> tempStack;
tempStack.emplace(0,n-1);
while (!tempStack.empty()) {
auto [l, r] = tempStack.top();
tempStack.pop();
st.emplace(l, r);
if (l + 1 < r) {
int mid = (l + r) >> 1;
tempStack.emplace(mid + 1, r);
tempStack.emplace(l, mid);
}
}
while (!st.empty()) {
auto [left, right] = st.top();
st.pop();
if (left == right) continue;
else if (left + 1 == right) {
if (nums[left] > nums[right]) {
ret++;
swap(nums[left], nums[right]);
continue;
}
continue;
} else {
int mid = (left + right) >> 1;
int i = mid, j = right;
int tmp = 0;
while (j > mid) {//
while (i >= left && nums[i] > nums[j]) {
tmp++;
i--;
}
ret += tmp;
j--;
}
sort(nums.begin() + left, nums.begin() + right + 1);
}
ret%=threshold;
}
return ret;
}
};

