LeetCode 283. 移动零

题目描述

🔥 283. 移动零

image-20230304223011804

思路分析

我们可以使用双指针的方法来解决这个问题:

  1. 使用一个指针 i 记录当前非零元素应该放置的位置。
  2. 使用另一个指针 cur 遍历数组。
  3. cur 指针遇到非零元素时,将其与 i 指针位置的元素交换,并将 i 指针向前移动。
  4. 最终,所有的非零元素都会被移动到数组的前面,剩下的位置填充为零。

具体步骤如下:

  1. 初始化指针 i 为 0,表示当前非零元素应该放置的位置。
  2. 遍历数组 nums,使用指针 cur 进行遍历。
  3. 如果 nums[cur] 不为 0,则将 nums[cur]nums[i] 交换,并将 i 向前移动一位。
  4. 遍历结束后,所有的非零元素都已经被移动到数组的前面,零元素被移动到数组的末尾。

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
func moveZeroes(nums []int) {
	i := 0
	for j := 0; j < len(nums); j++ {
		if nums[j] != 0 {
			nums[i] = nums[j]
			i++
		}
	}
	for i < len(nums) {
		nums[i] = 0
		i++
	}
}
1
2
3
4
5
6
7
8
9
10
11
func moveZeroes(nums []int) {
	i := 0

	// 遍历数组,将非零元素移动到前面
	for cur := 0; cur < len(nums); cur++ {
		if nums[cur] != 0 {
			nums[i], nums[cur] = nums[cur], nums[i]
			i++
		}
	}
}
  • 时间复杂度:O (N),其中 N 是数组的长度。我们只遍历了数组一次。
  • 空间复杂度:O (1),我们只使用了常数级别的额外空间。

🍏 点击查看 Java 题解

1
write your code here
本文作者:
本文链接: https://hgnulb.github.io/blog/2023/93474974
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!