本文共 1175 字,大约阅读时间需要 3 分钟。
题目:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。
分析:
方法一: 直接遍历,遇到0就删除,并在数组末尾添加见代码1 方法二: 与相似,方法一比较耗时,如果能够只针对非0元素进行移动,将其放到前面,时间复杂度能降低一级;见代码2,利用一个replace指针指向当前选一个替换的位置; 方法三: 遍历数组,replace指针指向遇到 第一个0 元素,此时向后遍历遇到的下一个非0元素,与replace指针指向进行交换;并记录当前非零元素位置;replace指针指向下一个 0 元素; 重复上述过程,并使用记录下来的非零元素位置开始寻找下一个非0元素;(与方法二的实现类似)代码1:ac
class Solution { public: void moveZeroes(vector & nums) { int m = nums.size(); if(!m) return; for(int i = 0; i < m; i++) { if(nums[i] == 0){ nums.erase(nums.begin() +i); nums.push_back(0); i--;m--; } } }};
代码2:ac
class Solution { public: void moveZeroes(vector & nums) { int m = nums.size(), replace = 0; // [0,1,0,3,12] 第一次遍历将前面所有的元素都换成非0的 for(int i = 0; i < m; i++) { if(nums[i] != 0){ nums[replace++] = nums[i]; } } for(int i = replace; i < m; i++){ // 第二次遍历将剩下的元素都置为0 nums[i] = 0; } }};
转载地址:http://zpzwi.baihongyu.com/