【算法分析与设计】移动零

本文介绍了如何在不复制数组的情况下,使用双指针优化策略将数组中的所有0移动到末尾,同时保持非零元素的相对顺序,降低了时间复杂度。作者给出了两种思路并提供了代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

思路:

从前往后开始遍历,找到不为0就与前面的值进行交换,

直到交换到第一个回去不为0的值结束。

代码实现:

class Solution {
    public void moveZeroes(int[] nums) {
       int left=0;
       int right=nums.length-1;
       int temp=0;
        for(int i=0;i<nums.length;i++){
            for(int j=i;j>0;j--){
                if(nums[j-1]!=0){
                    break;
                }
                 temp=nums[j];
                 nums[j]=nums[j-1];
                 nums[j-1]=temp;
                
            
            }
        }
           
          
    }
}

击败5%的用户。。。

肯定不是这样写的,这样写时间复杂度应该到了nlogn了(emmm不会算)

想别的方法呃,。。。

ding ding ding dong 有了!!!

思路二:

可以利用双指针嘛。

left指针指向最初的位置

right从0开始遍历,找到不为0的数字就和left指针的值进行交换

之后left++;

最后right找到末尾后。直接将left右边的所有值置为0即可。

 开始都指向索引0的节点。

之后right++

 此时right指向索引为1的节点。这个节点的值为1就与left所指向的节点交换值之后,left++,right++

 发现right指向的为0,不处理下一个right++

发现right指向3 与left的节点值交换,left++.,right++ 

之后right指向12 再交换,最后left的右边的所有节点置为0即可 

代码实现

class Solution {
    public void moveZeroes(int[] nums) {
       int left=0;

        for(int right=0;right<nums.length;right++){
            if(nums[right]!=0){
                nums[left]=nums[right];
                left++;
            }
        }
        for(int i=left;i<nums.length;i++){
            nums[i]=0;
        }
           
          
    }
}

nice! 通过成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

五敷有你

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

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

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

打赏作者

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

抵扣说明:

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

余额充值