题目
在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录 record
,返回其中存在的「交易逆序对」总数。
解法
归并排序。
如果左半部分的某个数 A比右半部分的某个数B 大(不是大于等于),那么左半部分在 A 之后的数肯定都比 B 大。因此可以计数逆袭对了。
代码
class Solution {
private int res = 0;
public int reversePairs(int[] record) {
sort(record, 0, record.length - 1);
return res;
}
private void sort(int[] record, int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
sort(record, left, mid);
sort(record, mid+1, right);
merge(record, left, mid, right);
}
}
private void merge(int[] record, int left, int mid, int right) {
int[] array = new int[right - left + 1];
int index = 0;
int leftIndex = left;
int rightIndex = mid + 1;
while (leftIndex <= mid && rightIndex <= right) {
if (record[leftIndex] <= record[rightIndex]) {
array[index++] = record[leftIndex++];
} else {
res += mid - leftIndex + 1;
array[index++] = record[rightIndex++];
}
}
while (leftIndex <= mid) {
array[index++] = record[leftIndex++];
}
while (rightIndex <= right) {
array[index++] = record[rightIndex++];
}
for (int a : array) {
record[left++] = a;
}
}
}