📌  相关文章
📜  C++ 程序在 O(n) 时间和 O(1) 额外空间内重新排列正数和负数(1)

📅  最后修改于: 2023-12-03 14:59:49.435000             🧑  作者: Mango

C++ 程序在 O(n) 时间和 O(1) 额外空间内重新排列正数和负数

本文介绍一个使用 C++ 编写的算法,可以在 O(n) 时间复杂度和 O(1) 额外空间复杂度的情况下重新排列一个整数数组,使得数组中的正数位于负数前面。

算法步骤
  1. 定义两个指针,一个指向数组的第一个元素,一个指向数组的最后一个元素。
  2. 使用类似快速排序的方式,从两端同时遍历数组。当找到第一个正数和第一个负数时,交换它们的位置。
  3. 继续遍历,直到两个指针相遇。
  4. 完成数组重新排列。
示例代码
#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) 额外空间复杂度下重新排列正数和负数的方法。通过定义两个指针并同时遍历数组,可以快速找到正数和负数,并进行交换。这个算法在需要重新排列正负数的情况下非常有效。