📅  最后修改于: 2023-12-03 14:59:49.435000             🧑  作者: Mango
本文介绍一个使用 C++ 编写的算法,可以在 O(n) 时间复杂度和 O(1) 额外空间复杂度的情况下重新排列一个整数数组,使得数组中的正数位于负数前面。
#include <iostream>
#include <vector>
void rearrangePositiveAndNegative(std::vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while (left < right) {
// 找到第一个正数
while (left < right && nums[left] < 0) {
left++;
}
// 找到第一个负数
while (left < right && nums[right] >= 0) {
right--;
}
// 交换正数和负数的位置
if (left < right) {
std::swap(nums[left], nums[right]);
}
}
}
int main() {
std::vector<int> nums = {-1, 2, 3, -4, 5, -6};
rearrangePositiveAndNegative(nums);
for (int num : nums) {
std::cout << num << " ";
}
return 0;
}
该算法使用两个指针从两端同时遍历数组,时间复杂度为 O(n)。同时,它没有使用额外空间,空间复杂度为 O(1)。因此,它符合题目要求。
这个算法给出了一种在 O(n) 时间复杂度和 O(1) 额外空间复杂度下重新排列正数和负数的方法。通过定义两个指针并同时遍历数组,可以快速找到正数和负数,并进行交换。这个算法在需要重新排列正负数的情况下非常有效。