题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
提示:
1 <= nums.length <= 10^4
-2^31 <= nums[i] <= 2^31 - 1
题目链接:https://leetcode.cn/problems/move-zeroes/
解答
思路与方法
我们使用双指针来解决这个问题,我们定义i
,j
两个变量初始值设置为0
,1
,然后遍历nums
数组,当nums[i]
为0
且nums[j]
不为0
时我们就交换它两的值,直到j
遍历完这个数组。
代码
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int i=0,j=1;
//设置初始值
while(j<nums.size())
{
//数不为0后移
if(nums[i])
i++;
//数为0交换
if(nums[i]==0&&nums[j])
{
swap(nums[i],nums[j]);
i++;
}
j++;
}
}
};
复杂度分析
时间复杂度:O(n)。n为数组长度,每个位置最多被遍历两次。
空间复杂度:O(1)。只使用了有限个变量来记录数据。