283. Move Zeroes

题目描述(简单难度)

在这里插入图片描述
将所有的 0 移动到末尾,并且保持其他数字的相对顺序不变。

解法一

我的第一反应是利用两个指针,一个指针指向开头,一个指针指向末尾非零元素,然后从开头指针遍历,如果遇到 0 就和末尾指向的元素相交换,末尾指针向前移动到非零元素。

这就保证末尾指针后边元素全部是 0,当首尾指针相遇的时候结束。

但是上边的想法会使得其他数字的相对顺序改变了,我们可以逆转一下思路。不是将0 放到末尾,而是将所有非零元素放到开头,这样就保证末尾剩下的都是 0 了。

同样利用双指针,指针 i 用于遍历数组,指针 j 开始指向开头,保证它前边的所有元素都是非 0 元素。

i 指针遇到非零元素就和 j 指针指向的元素交换,j 指针然后后移。

0,1,0,3,12 为例模拟一下过程。

0,1,0,3,12
^
i
j

nums[i] == 0, i 后移
0,1,0,3,12
^ ^
j i

nums[i] != 0, 交换和 j 指向的元素, i 后移, j 后移
1,0,0,3,12
  ^ ^
  j i

nums[i] == 0, i 后移
1,0,0,3,12
  ^   ^
  j   i

nums[i] != 0, 交换和 j 指向的元素, i 后移, j 后移
1,3,0,0,12
    ^   ^
    j   i

nums[i] != 0, 交换和 j 指向的元素, i 后移, j 后移, 遍历结束
1,3,12,0,0
       ^   ^
       j   i

可以注意到 j 前边的元素始终都是非零元素,可以结合代码再看下。

public void moveZeroes(int[] nums) {
    int j = 0;
    for (int i = 0; i < nums.length; i++) {
        //不等于 0 就交换
        if (nums[i] != 0) {
            int temp = nums[j];
            nums[j] = nums[i];
            nums[i] = temp;
            j++;
        }
    }
}
python版本
def moveZeroes(self, nums: List[int]) -> None:
        count = 0
        length = len(nums)
        for i in range(length):
            if nums[i] != 0:
                nums[count] = nums[i]
                count += 1
        if count:
            for i in range(count, length):
                nums[i] = 0
总结

双指针法经常用到,需要记住这个解题技巧。用一个指针用来分割元素,使得它前边都是符合某种条件的元素。在快速排序中,也有用到这个思想。

参考文献
  • https://zhuanlan.zhihu.com/p/120190623
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安替-AnTi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值