一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
Leetcode·283·移动零
1. 题目
给定一个数组
nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
2. 分析
这道题目的难度是属于简单级别,但这道题目也是我们学习双指针解法的一道好题目。从给定的题目我们可以得出三个信息:
- 不得使用复制数组操作。
- 元素为0总在尾部,其余元素按照先后顺序不变。
3. 编码
思路一:使用冒泡排序的方法
为什么能使用冒泡排序的方法?题目中我们可以知道,我们的目标是将0移动到数组的末尾,而排序的目的不正是移动元素吗?因此我们仅仅需要将判定的条件更改一下即可以满足需求。
class Solution {
public void moveZeroes(int[] nums) {
for (int i = 0; i < nums.length - 1; i++) {
for (int j = 0; j < nums.length - i - 1; j++) {
if (nums[j] == 0) {
int tempNum = nums[j + 1];
nums[j + 1] = nums[j];
nums[j] = tempNum;
}
}
}
}
}
思路二:利用快慢指针
快慢指针的本质无非就是建立两个指针,一左一右,一前一后,因此为了要实现题目的需要,我们必须让这两个指针一个指向0,而另外一个元素指向非0元素,且此时的左指针必须指向0,右指针必须指向非0元素,这样就能得到我们想要的结果。
class Solution {
public void moveZeroes(int[] nums) {
int j = 0;
for(int i = 0;i < nums.length; i++) {
if(nums[i]!= 0) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j++] = tmp;
}
}
}
}
4. 总结
思路一与思路二都可以解决这类排序的问题,二者的主要区别是在时间复杂度上,思路二比思路一在时间复杂度上少了一个指数级,相信大家通过此篇文章能有所收获。