📌  相关文章
📜  将所有负数移到开头,将正数移到结尾,并留有恒定的额外空间(1)

📅  最后修改于: 2023-12-03 15:39:17.248000             🧑  作者: Mango

将所有负数移到开头,将正数移到结尾,并留有恒定的额外空间

当需要将一个数组中的所有负数移动到开头,将正数移动到结尾,并且不能使用额外的空间时,我们需要使用双指针法。这种方法是比较常见,且具有普适性和高效性。

解法

我们使用两个指针 left 和 right,left 指向数组开头,right 指向数组结尾。

  1. 当 nums[left] < 0 时,left 向右移动一位,此时 nums[left] 已经满足条件。

  2. 当 nums[right] > 0 时,right 向左移动一位,此时 nums[right] 已经满足条件。

  3. 当 nums[left] > 0 且 nums[right] < 0 时,交换 nums[left] 和 nums[right],left 向右移动一位,right 向左移动一位。

重复以上三个步骤,直到 left 和 right 相遇为止。此时,数组中所有的负数已经移动到了开头,正数已经移动到了结尾。

代码
def move_numbers(nums):
    left, right = 0, len(nums) - 1
    while left < right:
        if nums[left] < 0:
            left += 1
        elif nums[right] > 0:
            right -= 1
        else:
            nums[left], nums[right] = nums[right], nums[left]
            left += 1
            right -= 1
    return nums
复杂度分析

时间复杂度:O(n)。

空间复杂度:O(1)。

总结

双指针法是一个普适性较高的方法。在本题中,它的时间复杂度为 O(n),空间复杂度为 O(1)。在使用双指针法的时候,需要注意指针的移动,以及交换操作的实现。