问题描述
给定一个数组
n
u
m
s
nums
nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
一、算法分析与代码
在一个数组 n u m s nums nums中,将所有零元素移至数组尾部,并且保持原数组非零元素相对位置。要想移动零元素,那么必须要找到数组中的零元素 n u m s [ l e f t ] nums[left] nums[left],这需要一个判断语句来判别,并且需要一个指针 l e f t left left来记录这个元素的位置。当找到零元素 n u m s [ l e f t ] nums[left] nums[left]时,还需要找到离这个零元素最近的一个非零元素 n u m s [ r i g h t ] nums[right] nums[right],然后进行交换。为了保证顺序相对不变,需要将从左到右依次搜索。为了方便,初始 l e f t = 0 , r i g h t = 0 left=0,right=0 left=0,right=0,当 r i g h t < n right<n right<n时,进行判断, n u m s [ r i g h t ] nums[right] nums[right]非零就进行交换,并各自指针右移一位。具体代码如下:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size(); //求数组长度
int left = 0, right = 0;
while(right < n) {
if(nums[right] !=0) {
swap(nums[left],nums[right]);//交换,保证left左边全部非零
left++; //移动一位,以待下次交换
}
right++;//每次判断都需要增加一
}
}
};
复杂度分析
时间复杂度:
O
(
n
)
O(n)
O(n),其中
n
n
n 为序列长度。每个位置至多被遍历两次。
空间复杂度:
O
(
1
)
O(1)
O(1)。只需要常数的空间存放若干变量。