C++代码 有一个包含 n 个数的数列,从中选出两个不同位置的数形成一个数对,要求:较左边的数除以 3 的余数 ≤ 较右边的数除以 3 的余数。
时间: 2024-12-13 13:20:06 浏览: 10
在C++中,你可以通过双指针方法来解决这个问题。首先,我们需要维护一个数组来跟踪每个数除以3后的余数,然后使用两个指针,一个指向当前元素,另一个指向下一个可能的位置。遍历整个数组:
```cpp
#include <vector>
using namespace std;
void findValidPairs(vector<int>& nums, int n) {
vector<int> remainders(nums.size(), 0);
for (int i = 0; i < nums.size(); i++) {
remainders[i] = nums[i] % 3;
}
sort(remainders.begin(), remainders.end());
int left = 0, right = 1;
int validPairs = 0;
while (right < remainders.size()) {
if (remainders[left] <= remainders[right]) {
validPairs++;
left++; // 移动左指针到下一个可能的值
} else {
right++; // 右指针向右移动,寻找新的可能组合
}
}
cout << "Valid pairs: " << validPairs << endl;
}
// 示例
int main() {
vector<int> nums = {4, 6, 5, 9, 3, 7};
int n = nums.size();
findValidPairs(nums, n);
return 0;
}
```
在这个例子中,我们先计算每个数的余数并排序,然后使用两个指针`left`和`right`,当满足条件`nums[left] % 3 <= nums[right] % 3`时,我们增加有效对的数量,并将`left`指针向右移动。如果条件不成立,说明当前的余数序列无法组成有效的数对,所以我们只需移动`right`。
阅读全文