LeetCode.283移动零
- 1.问题描述
- 2.解题思路
- 3.代码
1.问题描述
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
2.解题思路
双指针
- 设置两个指针指向开头元素。一个fast指针,一个slow指针
- fast指针向右移动,如果元素为0,不执行操作,向右移动,如果元素不为0,将fast指针所指元素,移到slow指针所在的位置,slow指针向右移动一位
- 当fast指针向右移动出界之后,将当前slow指针指向元素及其之后元素设置为0
3.代码
python:双指针
from typing import Listclass Solution:def moveZeroes(self, nums: List[int]) -> None:# 设置一个变量,用来指向经过一系列操作后数组中所有为 0 元素的第一个位置上# 一开始默认在索引为 0 的位置slow = 0# 从头到尾遍历数组# 遍历完毕之后,slow 指向了一个为 0 的元素,或者如果数组中不存在 0 ,就和 fast 一样,超过了数组的范围for fast in range(len(nums)):# 在遍历过程中,如果发现访问的元素是非 0 元素# 说明 slow 不在正确的位置上,需要向后移动,寻找合适的位置if nums[fast] != 0:# 这个时候,原先 slow 的值需要被 fast 的值覆盖nums[slow] = nums[fast]# slow 需要向后移动,寻找合适的位置slow += 1# 接下来,只需要把 slow 极其后面所有的元素都设置为 0 就行for i in range(slow, len(nums)):# 都设置为 0nums[i] = 0return numssolution = Solution()
res = solution.moveZeroes([0, 1, 2, 0, 3])
print(res)
C++:双指针
class Solution {
public:void moveZeroes(vector<int>& nums) {// 设置一个变量,用来指向经过一系列操作后数组中所有为 0 元素的第一个位置上// 一开始默认在索引为 0 的位置int slow = 0;for (int fast = 0; fast < nums.size(); fast++) {// 在遍历过程中,如果发现访问的元素是非 0 元素// 说明 slow 不在正确的位置上,需要向后移动,寻找合适的位置if (nums[fast] != 0) {// 这个时候,原先 slow 的值需要被 fast 的值覆盖nums[slow] = nums[fast];// slow 需要向后移动,寻找合适的位置slow++;}}// 接下来,只需要把 slow 极其后面所有的元素都设置为 0 就行for (int i = slow; i < nums.size(); i++) {// 都设置为 0 nums[i] = 0;}}
};