C++给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目。
时间: 2024-09-29 13:14:39 浏览: 101
在C++中,解决这个问题通常采用排序算法结合双指针法。你可以通过以下几个步骤计算给定序列的逆序对数量:
首先,对整个序列
a1, a2, ..., an
进行排序。可以使用快速排序、归并排序或其他高效的排序算法,如堆排序。创建两个指针,
left
初始指向数组的第一个元素,right
初始指向数组的最后一个元素。使用循环遍历整个数组。对于每个
left
位置的元素,它被视为基准值:- 如果
a[left] <= a[right]
,说明当前区间没有逆序对,直接移动左指针left++
。 - 否则,
a[left] > a[right]
,说明a[left]
到当前位置形成了一个逆序对。这时我们需要更新逆序对的数量,并将右指针向左移动一位,因为已经找到了一个逆序对a[left]
和a[j]
(其中j
从right
开始递减),直到找到a[left] <= a[j]
。
- 如果
当左右指针相遇时,结束循环,返回计算出的逆序对总数。
以下是伪代码示例:
int countInversions(vector<int>& nums) {
sort(nums.begin(), nums.end());
int inversions = 0;
for (int left = 0; left < nums.size(); left++) {
if (nums[left] <= nums[left + 1]) {
continue;
}
// 找到第一个大于nums[left]的元素作为边界
for (int right = nums.size() - 1; right >= left; right--) {
if (nums[right] < nums[left]) {
inversions += (right - left);
break;
}
}
}
return inversions;
}
相关推荐

















