Move Zeroes
题目描述
移动零
给定一个数组nums
,编写一个函数将所有0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
解法
方法一:可以使用额外数组,存放非零元素
时间复杂度:O(n)
空间复杂度:O(n)
func moveZeroes(nums []int) {
copy := make([]int, 0, len(nums))
for _, v := range nums {
if v != 0 {
copy = append(copy, v)
}
}
for i := 0; i < len(nums); i++ {
if i < len(copy) {
nums[i] = copy[i]
} else {
nums[i] = 0
}
}
return
}
方法二:双指针法,使用两次遍历
时间复杂度:O(n)
空间复杂度:O(1)
func moveZeroes(nums []int) {
first := 0
for i := 0; i < len(nums); i++ {
if nums[i] == 0 {
continue
}
nums[first] = nums[i]
first++
}
for i := first; i < len(nums); i++ {
nums[i] = 0
}
return
}
方法三:双指针法,使用一次遍历
时间复杂度:O(n)
空间复杂度:O(n)
func moveZeroes(nums []int) {
first := 0
for i := 0; i < len(nums); i++ {
if nums[i] == 0 {
continue
}
if (i != first) {
nums[first], nums[i] = nums[i], nums[first]
}
first++
}
return
}
Last updated
Was this helpful?