移动零
# 📃 题目描述
题目链接:283. 移动零 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
# 🔔 解题思路
和上道题一样 27. 移除元素 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)
右指针指向当前将要处理的元素,左指针指向下一个将要赋值的位置。
- 如果右指针指向的元素不等于 0,它一定是输出数组的一个元素,我们就将右指针指向的元素复制到左指针位置,然后将左右指针同时右移
- 如果右指针指向的元素等于 0,它不能在输出数组里,此时左指针不动,右指针右移一位处理下一个元素
最后把慢指针之后的数字全部赋值为 0 即可。
class Solution {
public void moveZeroes(int[] nums) {
if (nums == null || nums.length == 0 || nums.length == 1) {
return ;
}
int left = 0;
int right = 0;
while (right < nums.length) {
if (nums[right] != 0) {
nums[left] = nums[right];
left ++;
}
right ++;
}
// 将 slow 之后的元素全部赋 0
while (left < nums.length) {
nums[left] = 0;
left ++;
}
}
}
换一种更直观的写法:left 用来找 0,right 用来找到 left 后面第一个非 0 元素,然后进行交换,交换完毕后 left ++
class Solution {
public void moveZeroes(int[] nums) {
int left = 0;
int right = 0;
while (left < nums.length) {
if (nums[left] != 0) {
left ++;
continue;
}
// nums[left] == 0;
right = left + 1;
for (; right < nums.length; right ++) {
if (nums[right] != 0) {
break;
}
}
if (right != nums.length) {
swap(nums, left, right);
}
left ++;
}
}
private void swap(int[] nums, int left, int right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
}
# 💥 复杂度分析
- 空间复杂度:O(1)
- 时间复杂度:O(N)
🎁 公众号

各位小伙伴大家好呀,叫我小牛肉就行,目前在读东南大学硕士,上方扫码关注公众号「飞天小牛肉」,与你分享我的成长历程与技术感悟~
帮助小牛肉改善此页面 (opens new window)
Last Updated: 2023/02/16, 11:27:10