顺序表经典的OJ题 :移除元素与合并有序数组

题目一 移除元素:

题目要求:

  • 给你一个数组 nums 和一个值 val。
  • 你需要 原地 除所有数值等于 val 的素,并返回移除后数组的新长度.不要使用额外的数组空间。
  • 你必须仅使用 0(1) 额外空间并 原地 修改输入数组元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

注意最后返回的是新数组的长度! 

图例:

注意,本题要求:不要使用额外的数组空间。

如上图中情况,我们使用双指针解法 

图例: 

起始:

开始遍历数组,src指向的数据为val,所以进行src++

 src指向的数据不是val,把src指向的数据交给dst所在的位置

随后src和dst都++

如此遍历下去,直到src越界或者遍历结束最后返回dst

代码输入:

nums是数组名 numsSize是数组大小 val是需要删除的数据,最后返回dst 

 

题目二 合并两个有序数组:

题目内容:

  • 给你两个按非递减顺序排列的整数数组 nums1 和 nums2,另有两个整数 m和n分别表示 nums1 和 nums2 中的元素数目。
  • 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序排列

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。

为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后n 个元素为 0 ,应忽略。 nums2 的长度为 n 。 

举例:

  • 做法:定义三个指针,第一个和第二个分别在数组1数组2的最后一位有效数据的位置数,而第三个指针放在第一个数组的末端位置
  • 随后开始指针1和指针2的向前循环遍历比较,在二者指向的数据中,数据大的往指针三所指向的位置进行存放
  • 存放完毕后,被存放的那个数据所代表的指针往前移,没有被存放的数据继续进行比较
  • 同时指针3朝前移动
  • 能怎么做的原因:两个按非递减(递增)顺序排列的整数数组 nums1 和 nums2 

图例:

初始:

相互比较 6 更大进行指针3的插入

同时指针3往前移,6所代表的指针1也往前移 

并且指针2所指的数据再次和指针1所指的数据继续比较

指针1和指针3再度往前移动,再度比较和移动后

指针1越界了,因为指针一越界,且因为两个数组本质起始是从小到大进行排列,所以指针3指向的位置接下来就应该存放指针2指向的数据,然后二者走完遍历结束 

代码输入:

  • l1=m-1 , l2=n-1 二者分别指向最后一位有效数据(有效数据相当于数组大小)
  • m+n是空间大小,但在这里是数组1的大小 

同时这里只有2种情况,那就是数组2走完了,数组1没走完,但是呢数组1和数组2的数据全部是放在数组1中的,数组2走完也是表明数组2的数据是比数组1内的数据都大所以放在数组1的后排,而数组1走完表明数组1比数组2的数据都大,所以数组2的数据需要放在在数组1的前排 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值