题目
代码(8.12 首刷看解析)
用归并的思想。先求局部的逆序对,求好后就归并排好序,再求外部的逆序对。
var tmp []int
func reversePairs(nums []int) int {
tmp = make([]int, len(nums))
return merge(nums, 0, len(nums)-1)
}
func merge(nums []int, l, r int) (res int) {
if l >= r {
return
}
mid := (l + r)/2
res += merge(nums, l , mid) + merge(nums, mid+1, r)
i, j, k := l, mid + 1, 0
for i <= mid && j <= r {
if nums[i] <= nums[j] {
tmp[k] = nums[i]
k++
i++
} else {
tmp[k] = nums[j]
res += (mid - i + 1)
k++
j++
}
}
for i <= mid {
tmp[k] = nums[i]
k++
i++
}
for j <= r {
tmp[k] = nums[j]
k++
j++
}
for m := 0; m < r-l+1; m++ {
nums[l+m] = tmp[m]
}
return
}
class Solution {
public:
vector<int> tmp;
int InversePairs(vector<int>& nums) {
tmp.resize(nums.size());
return merge(nums, 0, nums.size() - 1)%1000000007;
}
int merge(vector<int>& nums, int left, int right) {
if(left >= right)
return 0;
int mid = (left+right)/2;
int res = (merge(nums, left, mid) + merge(nums, mid+1, right))%1000000007;
int i = left, j = mid + 1;
int k = left;
while(i <= mid && j <= right) {
if(nums[i] <= nums[j]) {
tmp[k++] = nums[i++];
} else {
res = (res + (mid - i + 1)%1000000007);
tmp[k++] = nums[j++];
}
}
while (i <= mid) {
tmp[k++] = nums[i++];
}
while(j <= right) {
tmp[k++] = nums[j++];
}
copy(tmp.begin() + left, tmp.begin() + right+ 1, nums.begin() + left);
return res;
}
};
代码(9.24 二刷看解析)
class Solution {
public:
vector<int> tmp;
int reversePairs(vector<int>& record) {
tmp.resize(record.size());
return merge(record, 0, record.size()-1);
}
int merge(vector<int>& record, int l, int r) {
if(l >= r)
return 0;
int mid = (l+r)/2;
int res = merge(record, l, mid) + merge(record, mid+1, r);
int i = l, j = mid+1, k = 0;
while(i <= mid && j <= r) {
if(record[i] <= record[j]) {
tmp[k++] = record[i++];
} else {
res += mid-i+1; // 后面的数都比他大
tmp[k++] = record[j++];
}
}
while(i <= mid)
tmp[k++] = record[i++];
while(j <= r)
tmp[k++] = record[j++];
copy(tmp.begin(), tmp.begin()+k, record.begin()+l);
return res;
}
};