移动零
一、题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
二、解法
1、暴力法O(n)
遍历数组每个元素,非0则依次放入数组中,最后末尾补0。
图解算法
Java代码
class Solution {
public void moveZeroes(int[] nums) {
int index = 0;
for(int num:nums){
if(num != 0){
nums[index] = num;
index++;
}
}
while(index < nums.length){
nums[index] = 0;
index++;
}
}
}
2、双指针法(进阶)O(n)
快慢指针,扫描元素,如果是慢指针是0,快指针非0,则快慢指针交换元素,将0放到后面,快慢均加1。
如果快慢指针都是0,则快指针向后加1。
如果快指针不是0,则快慢均加1。
图解算法
Java代码
class Solution {
public void moveZeroes(int[] nums) {
int n = nums.length, left = 0, right = 0;
while (right < n) {
if (nums[right] != 0) {
swap(nums, left, right);
left++;
}
right++;
}
}
public void swap(int[] nums, int left, int right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
}