递归调用时或者多次循环里不要有申请大数组的操作,否则会导致超时。
如leetcode的面试题51. 数组中的逆序对
我把临时数组放在merge里申请,提交导致超时,把临时数组当做全局变量,通过了。
class Solution {
public:
int ans = 0;
vector<int> a;
int reversePairs(vector<int>& nums) {
a.resize(nums.size());
mergeSort(nums, 0, nums.size());
return ans;
}
void mergeSort(vector<int>& nums, int l, int r) {
if (l + 1 < r) {
int mid = (l + r) / 2;
if (mid & 1 && r - l > 2) mid++;
mergeSort(nums, l, mid);
mergeSort(nums, mid, r);
merge(nums, l, mid, r);
}
}
void merge(vector<int>& nums,int l, int mid, int r) { // 左闭右开
// vector<int> a(nums.size());
for (int i = l; i < r; i++)
a[i] = nums[i];
int i = l, j = mid, k = l;
while (i < mid && j < r) {
if (a[i] > a[j]) {
nums[k] = a[j++];
ans += mid - i; // 从i-mid-1 都大于a[j]因此逆序对都+1
} else {
nums[k] = a[i++];
}
k++;
}
while (i < mid) {
nums[k++] = a[i++];
}
while (j < r)
nums[k++] = a[j++];
}
};
278

被折叠的 条评论
为什么被折叠?



