283. 移动零
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums =[0,1,0,3,12]
输出:[1,3,12,0,0]
示例 2:
输入: nums =[0]
输出:[0]
算法思路
核心目的是,将不是0的数字按照顺序依次交换到前面去
-
核心思想:
- 使用双指针
left
和right
,right
用于遍历数组,left
用于记录非零元素的位置。 - 当
nums[right]
不为 0 时,将其与nums[left]
交换,并将left
右移。 - 最终,所有非零元素会被移动到数组的前面,而所有 0 会被移动到数组的末尾。
- 使用双指针
-
具体步骤:
- 初始化两个指针
left
和right
为 0。 - 遍历数组:
- 如果
nums[right]
不为 0,则交换nums[left]
和nums[right]
,并将left
右移。 - 无论是否交换,
right
都右移。
- 如果
- 最终,数组中的所有 0 会被移动到末尾。
- 初始化两个指针
-
关键点:
- 通过交换操作,将非零元素移动到数组的前面,同时保持其相对顺序。
- 时间复杂度为
O(n)
,空间复杂度为O(1)
。
class Solution(object):
def moveZeroes(self, nums):
n = len(nums) # 数组的长度
left = right = 0 # 初始化两个指针 left 和 right
while right < n: # 遍历数组
if nums[right] != 0: # 如果当前元素不为 0
nums[left], nums[right] = nums[right], nums[left] # 交换 left 和 right 的元素
left += 1 # 移动 left 指针
right += 1 # 移动 right 指针
时间复杂度分析
- 遍历数组:使用
right
指针遍历数组,时间复杂度为O(n)
。 - 交换操作:每次交换的时间复杂度为
O(1)
。 - 总时间复杂度:
O(n)
。
空间复杂度分析
- 原地操作:没有使用额外的空间,空间复杂度为
O(1)
。 - 总空间复杂度:
O(1)
。