📅  最后修改于: 2023-12-03 15:39:17.248000             🧑  作者: Mango
当需要将一个数组中的所有负数移动到开头,将正数移动到结尾,并且不能使用额外的空间时,我们需要使用双指针法。这种方法是比较常见,且具有普适性和高效性。
我们使用两个指针 left 和 right,left 指向数组开头,right 指向数组结尾。
当 nums[left] < 0 时,left 向右移动一位,此时 nums[left] 已经满足条件。
当 nums[right] > 0 时,right 向左移动一位,此时 nums[right] 已经满足条件。
当 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)。在使用双指针法的时候,需要注意指针的移动,以及交换操作的实现。