题目描述:
题号:283
题目描述:
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 :
输入: nums =[0,1,0,3,12]
输出:[1,3,12,0,0]
解题思路:
思路一:双指针
本题特点:
1、左指针左边均为非零数。
2、右指针左边直到左指针处均为零。
因此,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。
右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。
时间复杂度:O(N)
空间复杂度:O(N)
C++
// C++
class Solution {
public:
void moveZeroes(vector<int>& nums) {
if(nums.size() == 0) {
return ;
}
int left = 0, right = 0;
while(right < nums.size()) {
// 这里要注意:每次交换,都是将左指针的零与右指针的非零数交换
if(nums[right] != 0) {
swap(nums[left], nums[right]);
left++;
}
right++;
}
return ;
}
};
go
// go
func moveZeroes(nums []int) {
if len(nums) == 0 {
return
}
left, right := 0, 0
for right < len(nums) {
// 这里要注意:每次交换,都是将左指针的零与右指针的非零数交换
if nums[right] != 0 {
nums[left], nums[right] = nums[right], nums[left]
left++
}
right++
}
}