Leetcode 283题 移动零(双指针思想)
题目描述:
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入:[0,1,0,3,12]
输出:[1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
解题思路:
双指针解法:慢指针low指向非零元素的尾标,快指针fast遍历整个数组,快指针fast若遇到非零元素,则进行与慢指针交换元素。快指针fast若遇到零,则加1往前遍历。
C++实现:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int nums_len = nums.size();
int low = 0;
for(int fast=0;fast < nums_len;fast++){
if(nums[fast] != 0){
int temp = nums[low];
nums[low] = nums[fast];
nums[fast] = temp;
low++;
}
}
}
};
java实现:
class Solution {
public void moveZeroes(int[] nums) {
int low = 0;
for(int fast=0;fast < nums.length;fast++){
if(nums[fast] != 0){
int temp = nums[low];
nums[low] = nums[fast];
nums[fast] = temp;
low++;
}
}
}
}
python实现:
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
low = 0
for fast in range(len(nums)):
if nums[fast] != 0:
nums[low],nums[fast] = nums[fast],nums[low]
low += 1