目录
- 题目
- 过程
- 解法
题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
过程
class Solution {
public:void moveZeroes(vector<int>& nums) {//左边开始复写0的位置,用交换法int slow=0;int fast=0;while(fast<nums.size()){if(nums[fast]==0){fast++;}else{nums[slow++]=nums[fast++];}}//将慢指针之后的置0for(int i=slow;i<nums.size();i++){nums[i]=0;}}
};
看看如何减少时间复杂度
解法
看了下题解改进了一下,主要还是最后那个for循环置零的操作,太多余和浪费运算时间了。不如交换。因为置零就等于对每个数进行遍历。时间复杂度为O(n),而交换可能交换一半就可以结束了,时间复杂度为O(log2n)
class Solution {
public:void moveZeroes(vector<int>& nums) {//左边开始复写0的位置,用交换法int slow=0;int fast=0;while(fast<nums.size()){if(nums[fast]==0){fast++;}else{swap(nums[slow++],nums[fast++]);}}}
};