简介
题目链接:https://leetcode.cn/problems/move-zeroes/description/?envType=problem-list-v2&envId=2cktkvj
解决方式:双指针
这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法!
双指针两次遍历
class Solution {
// 双指针两次遍历
public void moveZeroes(int[] nums) {
// 第一次遍历将所有非零的数放在数组的左边
// 第二次遍历则将剩下的数组部分全部置为 0
int i = 0;
// 第一次遍历
for(int j = 0; j < nums.length; j++){
if(nums[j] != 0){
nums[i++] = nums[j];
}
}
// 第二次遍历。从 i 开始,因为 i 此时指向的是数组剩余全部为零的部分的开始
for(int j = i; j < nums.length; j++){
nums[j] = 0;
}
}
}
双指针一次遍历
大佬参考了快速排序的思想,是对快速排序的一种异化。
class Solution {
// 双指针一次遍历
public void moveZeroes(int[] nums) {
// 特例判断
int length;
if(nums == null || (length = nums.length) == 0){
return;
}
// 双指针参考快速排序的方式,以 0 作为左右的中间点
// 一个指针始终指向第一个 0
// 一个指针遍历整个数组(效果类似于找到右边第一个不为 0 的数)
int i = 0;
for(int j = 0; j < length; j++){
// j 指针遍历整个数组
// 如果当前的数字不为 0,则要与 i 指针交换
if(nums[j] != 0){
// 限制,如果 j 指针不大于 i 指针,则不进行交换
// 因为这往往意味这前面的数都是非零的数,i 指针一直在移动直到找到第一个 0
// 同时,避免 i j 指针指向同一个数而发生同一个数的交换
if(j > i){
// 此时,i 指针指向第一个 0,j 指针遍历到不为零的数,则发生交换
// 参考快速排序。中间值是 0,不为零的数放 0 左边,反之在 0 右边
nums[i] = nums[j];
nums[j] = 0;
// 上述代码是对经典交换代码的优化,提升效率
}
// 两种情况
// 第一种,前面都是非零数,一直在找第一个 0
// 第二种,发生了交换,继续找第一个 0
i++;
}
}
}
}

被折叠的 条评论
为什么被折叠?



