力扣----不同题(1,2题)的相同解决方案,值得总结!

1.移除元素

我们可以有多种方法解决这个问题:

A遍历整串数据,如果是val的值,就让后面的数据向前移动覆盖掉,有几个val就让后面的数据前移几次,我们可以计算一下这个方法的时间复杂度,时间复杂度就要按照最坏的情况进行考虑,假设全部都是我们想要删除的val值,就分别需要向前移动n-1,n-2,n-3,n-4等等,按照这个等差数列,我们进行求和计算,即可得到结果;时间复杂度O(N^2);

B我们创建一个新的数组,把不是val的数据放到这个新的数组里面去,再把这个新的数组拷贝到原来的数组里面去,这个时候只需要遍历一次,时间复杂度是O(N);这个就是用空间换时间;

C双指针的解决方法,我们下面介绍的就是这个做法,我们不需要创建新的数组,在原来的数组里面就可以解决这个问题;

(1)我们这里定义了两个指针,一个src,一个dest指针,指针的指向如图所示:我们用图里面的数据作为例子介绍这个算法;(假设val=3)

(2)src指向的数据不是val,就让src指向的值赋值给dest指向的值,因为两个指针指向的数据一样,因此这个就是自己赋值给自己,并没有发生实质性的变化;,指向1,2的时候都是一样的,两个指针的移动速度是一样的,而且并没有遇到我们想要的val值,这个时候的赋值都是自己赋值给自己;

(3)但是当我们的src指向3的时候,等于val值,这个时候我们的src向后移动,dest不动,下一个数字4,src指向的4不等于val值,src指向的值赋值给dest指向的值(这个时候的赋值就会真正的发挥作用了,而不是像前面的1,2时候,是自己赋值给了自己),我们赋值完成之后,两个指针同时向后移动,src指向5,dest指向4,这个时候src指向赋值给dest指向,指针继续移动,src指向3,dest不动,src此时指向val,在向后就没有数据了,这个时候dest的前面的数据正好是我们想要的数据。

2.去除数组里面的重复项

(1)虽然这道题目和上面的题目看似无关,但是两者的解决方案却是一样的,这个提米我们设置了3个指针,i,j,dest指针,指向如图所示;

(2)判断ij指针指向的元素是否一样,如果一样j向后移动,其他的两个指针不动,这个时候j指向的是1和i指向的数据不相同,我们就要把i指向的数据赋值给dest,这个时候和尚一道题目相似,就是自己赋值给了自己(这个时候,赋值的作用还没有凸显出来);

(3)接下来的操作就会很关键了:i指针跳到j指针指向的位置,dest指针向后移动;这个时候ij都指向数字1,i不动,j向后移动,j移动两次都是和i指向的数据一样,我们的i和dest这个时候都不动,当j指向的数字是2的时候,ij指向的数据已经不一样了,我们就把i指向的数字赋值给dest,dest向后移动一位,i跳跃到j指针指向的位置,依次进行下去,结束的时候dest指针前面的数据就是我们想要的;

(4)最后结尾的数字,我们依然不能忘记考虑,这里的情况图里已经表示:j越界之后,就要把i指向的数字赋值给dest,dest++;当最后的两个数据一样的时候,我们依然要把src指向的数据赋值给dest,dest++;(下面的图示);

(5)我们总结一下就可以发现,这个过程里面j始终是在移动的,i和dest只有ij指向的数据不同时才会移动,dest每次只会移动一个步长,i移动的距离视情况而定;

3.合并两个有序数组

(1)定义了3个指针,我们首先要知道nums1足够大可容纳两个数组(nums1和nums2);

(2)我们定义的指针,l1指向第一个数组实际元素的末尾位置,l2指向第二个数组的末尾位置,l3指向第一个数组所有元素的末尾位置;

(3)两个数组的元素比较大小,当那个元素小的话,就从l3的位置向前放置,如果l2有多余的,就需要把剩余的元素挪动到l1里面去,如果l1有多余的,我们不需要进行任何处理(因为是顺序表,本来就是有序的)。

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值