Leetcode刷题-----移动零283&&复写零问题1089

目录

1.问题介绍

1.1题目要求

1.2思路分析

1.3想法实现

2.复写零问题

2.1问题分析

2.2思路分析

2.3想法实现


1.问题介绍

1.1题目要求

把这个数组里面为0的元素挪动到这个数组的后面,其他的非零元素的相对位置保持不变;

1.2思路分析

这个里面,我们是把这个数组划分为三个区域,左边区域,右边区域和中间区域,这三个区域里面存放着特定的数据,方便我们对于这个数据进行管理;

三个区间就是有两个分隔符,第一个就是使用的dest指针分开的,第二个就是用的cur指针分开的,cur指针就是用来遍历这个数组里面的元素的,cur左边就是已经遍历完成的元素,cur右边就是待处理的元素,其中已经处理的元素里面可能有0元素,我们的这个dest指针指向的就是已经处理的元素里面的最后一个非零元素的位置;

1.3想法实现

我们上面已经介绍了,这个cur指针就是用来遍历这个数组的,因此咋刚开始的时候,这个cur指针指向这个数组里面下标是0的元素,dest指向的是这个已经遍历的元素里面最后一个不是0的元素;

因此这个dest这个时候指向的就是-1下标位置,因为这个时候我们的cur还没有开始遍历数组;

我们的外层就是遍历数组元素的for循环,内层有一个if循环,是用来判断这个数组元素是否是0,如果是0,我们的cur直接加加,不是0的话才会进入这个if循环,我们让这个指针指向的非零元素和dest++即dest指向的下一个元素0进行交换,这样就可以让这个非0元素放到数组前面,0放到数组后面;

2.复写零问题

2.1问题分析

这个题目表面上面打的标签的简单,但是想使用双指针实现这个确实很有难度的,对于初学者,理解上没难度,但是想要自己第一次就独立的实现却很困难,这个就是把是0的元素重复写2次,不是0的元素就直接写一次即可,但是这个因为是0一次写2次,这个最后有一些元素没有写进来(因为这个数组元素个数是有限的),像下面的第一个实例,写到4这个数组元素就填满了,这个时候的5和最后一个0就不需要管了;

2.2思路分析

下面的这个就是思路,但是初学者一般想不到,下面的这个是优化之后的版本,原来的版本是异地进行复写(但是题目要求是在就地进行解决问题),优化之后不想要开辟新的空间,在原来的基础上面就可以复写;

首先一个我们需要明确的就是这个指针的遍历,移动都是从后向前移动的,因为如果是从前向后移动,这个两个0的复写就会覆盖掉后面一个位置的元素,因此我们会从后向前复写;

我们把这个过程程序化,分为了三个步骤第一步就是确定这个复写位置开始的元素,这个具体是什么意思呢?使用我们上面的官方题目下面的第一个案例来讲,这个4就是我们要开始复写的位置;因为这个案例我们已经知道复写位置,当面对其他的测试用例的时候,我们需要首先找到这个位置开始的地方,才可以进行后续的运算;

我们的方法就是判断cur位置的数值,当是0的时候,这个dest移动2步,当不是0的时候,dest移动一个步长,当这个dest指向这个数组里面的最后一个元素的时候,这个cur指向的位置就是这个复写的位置;

当然我们还会遇到一类特殊情况需要处理一下,就是当这个数组元素是1-2300这个情况的时候,这个dest按照上面的思路就会直接到达这个n下标的位置,这个就会直接越界;

这个时候我们进行的特殊处理就是把这个n-1下标,也就是最后一个数组元素置为0,cur--,dest-=2,这个操作完成之后也是可以找到正确的复写位置的(这个就很难想到,我觉得);

最后我们从后向前进行遍历,cur指向的元素不是0的时候,这个cur指向的元素赋值给dest位置,然后两个指针都向前移动一位,当这个cur指向-0的时候,这个dest以及前面的一个位置的元素全部都要置为0,然后让这个dest--,cur--直到这个cur完成全部数组元素的遍历;

2.3想法实现

其实真正的按照老师讲的这个双指针解决这个问题确实过于复杂,我们可以直接通过下面的暴力解法求解这个问题,让这个两个循环来回的挪动数据,只不过这个是0后面的元素都要挪动,在数据量比较小的时候,这个方法还可以用一下,当这个数据量比较大的时候,这个方法的时间复杂度就会比较大了,反正这两个各有利弊吧,论难易度的话,下面的这个暴力算法可能会更简单一些;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值