移动零
题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
题目链接
请注意,必须在不复制数组的情况下原地对数组进行操作。
示例 1
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2
输入: nums = [0]
输出: [0]
题意理解
将数组中所有数字 0 移至数组末尾,且非零元素的相对顺序保持不变,要求原地修改数组。
解题思路
- 暴力解法:使用两层循环两两交换,时间复杂度 O ( N 2 ) O(N^2) O(N2),效率较低,不推荐在面试中使用。
- 优化解法:双指针(经典算法)
- 左指针:定位数组中第一个值为 0 的元素
- 右指针:定位左指针后方第一个非 0 元素
- 找到对应位置后交换两个指针指向的元素,循环执行直至遍历完成
- 需重点留意边界条件,防止数组下标越界。
代码实现
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size();
int l = 0, r = 0;
while(l < n && r < n){
// 左指针找到第一个0
while(l < n && nums[l] != 0) l++;
r = l + 1;
// 右指针找到后续第一个非0
while(r < n && nums[r] == 0) r++;
// 未越界则交换
if(r < n){
swap(nums[l],nums[r]);
}
}
}
};
每日心灵鸡汤
积跬步以至千里,守初心方得始终。

773

被折叠的 条评论
为什么被折叠?



