题目描述
最容易想到的解法
从后向前遍历, 发现0就通过交换相邻元素将0移动到最后
class Solution {func moveZeroes(_ nums: inout [Int]) {for index in (0..<nums.count).reversed() {if nums[index] == 0 {moveZeroes(&nums, index)}}}func moveZeroes(_ nums: inout [Int], _ index: Int) {var current = indexwhile current < nums.count - 1 {nums.swapAt(current, current + 1)current += 1}}
}
最优解 - 双指针
左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。
class Solution {func moveZeroes(_ nums: inout [Int]) {let length = nums.countvar left = 0, right = 0while right < length {if nums[right] != 0 {nums.swapAt(left, right)left += 1}right += 1}}
}
- 时间复杂度:O(n)
- 空间复杂度:O(1)