- 标签:数组、双指针
- 难度:简单
描述:给定一个数组
要求:将所有
说明:
- 只能在原数组上进行操作。
-
$1 \le nums.length \le 10^4$ 。 -
$-2^{31} \le nums[i] \le 2^{31} - 1$ 。
示例:
- 示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
- 示例 2:
输入: nums = [0]
输出: [0]
冒泡排序的思想,就是通过相邻元素的比较与交换,使得较大元素从前面移到后面。
我们可以借用冒泡排序的思想,将值为
因为数据规模为
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
for i in range(len(nums)):
for j in range(len(nums) - i - 1):
if nums[j] == 0 and nums[j + 1] != 0:
nums[j], nums[j + 1] = nums[j + 1], nums[j]
- 时间复杂度:$O(n^2)$。
- 空间复杂度:$O(1)$。
- 使用两个指针
$slow$ ,$fast$。$slow$ 指向处理好的非$0$ 数字数组的尾部,$fast$ 指针指向当前待处理元素。 - 不断向右移动
$fast$ 指针,每次移动到非零数,则将左右指针对应的数交换,交换同时将$slow$ 右移。 - 此时,$slow$ 指针左侧均为处理好的非零数,而从
$slow$ 指针指向的位置开始,$fast$ 指针左边为止都为$0$ 。
遍历结束之后,则所有
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
slow = 0
fast = 0
while fast < len(nums):
if nums[fast] != 0:
nums[slow], nums[fast] = nums[fast], nums[slow]
slow += 1
fast += 1
- 时间复杂度:$O(n)$。
- 空间复杂度:$O(1)$。