Leetcode283.移动零
题目地址
题目详情
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
思路
借鉴快速排序的思想,使用双指针方法来实现:left、right指针初始在数组0位置。left表示[0,left)这个区间中数字都不为0,right负责遍历整个数组。为了保证非零元素的相对顺序,当right指向非零元素时,需要进行nums[left]与nums[right]两个元素互换,随后left移动一位。
也可以这么理解,将数组中所有非零元素按照相对顺序保留在[0,left)区间中,而[left, right)中则是数组中的非零元素。
实现代码
func moveZeroes(nums []int) {
// 数组为空,则直接返回
if len(nums) == 0 {
return
}
// 定义左右指针和数组长度
left, right, lens := 0, 0, len(nums)
// 遍历数组
for right < lens {
// 如果遇到非零元素,则包含在[0,left)区间中
if nums[right] != 0 {
nums[left], nums[right] = nums[right], nums[left]
left++
}
// 遍历数组
right++
}
}
复杂度分析
时间复杂度:O(n),其中 n 为序列长度。每个位置至多被遍历两次。
空间复杂度:O(1)。只需要常数的空间存放若干变量。
参考
Leetcode题解