题目描述
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例
示例1
输入:nums = [0,1,0,3,12]
输出:[1,3,12,0,0]
实例2
输入:[0]
输出:[0]
解题思路
采用双指针的思路,左指针和右指针,初始都从数组的最左端开始
当右指针的数字不为0,而左指针的数字为0时,则进行一次左右指针指向的数字的交换。然后当左指针指向的数字不为0时,则向右走一步,而右指针默认都需要向右走一步,直到到达数组的最右端
代码
func moveZeroes(nums []int) {
length := len(nums)
right := 0
left := 0
for right < length {
// 当右指针的数不为0,而左指针的数为0时,执行数字的交换
if nums[right] != 0 && nums[left] == 0 {
swap(nums, left, right)
}
// 当左指针指向的数不为0时,左指针向右走一步
if nums[left] != 0 {
left++
}
// 右指针默认向右走一步
right++
}
}
func swap(nums []int, i, j int) {
nums[i], nums[j] = nums[j], nums[i]
}
复杂度分析
时间复杂度:很明显,对数组遍历了一次,所以时间复杂度为O(N),其中N为数组的长度
空间复杂度:只使用length,left,right三个整数类型的变量,所以其空间复杂度为O(1)