🙋大家好!我是毛毛张!
🌈个人首页: 神马都会亿点点的毛毛张 原地移除元素2
LeetCode链接:283. 移动零
1.题目描述
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
提示:
- 1 < = n u m s . l e n g t h < = 1 0 4 1 <= nums.length <= 10^4 1<=nums.length<=104
- − 2 31 < = n u m s [ i ] < = 2 31 − 1 -2^{31} <= nums[i] <= 2^{31} - 1 −231<=nums[i]<=231−1
进阶: 你能尽量减少完成的操作次数吗?
2.题解
- 注意这道题目需要保证非零元素的相对顺序,而这道题目的相对顺序可以改变:27.移除元素
2.1 双指针 | 一次遍历 | 操作次数多
java
class Solution {
public void moveZeroes(int[] nums) {
// 使用双指针方法,一次遍历数组
int left = 0, right = 0;
// 遍历整个数组
for (right = 0; right < nums.length; right++) {
// 如果当前元素不是0
if (nums[right] != 0) {
// 交换当前元素和左指针指向的元素
int temp = nums[right];
nums[right] = nums[left];
nums[left] = temp;
// 左指针右移
left++;
}
}
}
}
2.2 双指针 | 两次遍历 | 操作次数少
java
class Solution {
public void moveZeroes(int[] nums) {
// 第一次遍历,使用 j 指针记录非零元素的个数
// 只要是非零元素,就将其赋给 nums[j]
int j = 0;
for (int i = 0; i < nums.length; ++i) {
if (nums[i] != 0) {
nums[j++] = nums[i];
}
}
// 非零元素统计完了,剩下的元素都是零
// 第二次遍历,将数组末尾的元素都赋值为零
for (int i = j; i < nums.length; ++i) {
nums[i] = 0;
}
}
}