顺序表经典的OJ题

题目一 移除元素:

题目要求:

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

图例:

顺序表经典的OJ题_第1张图片

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

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

顺序表经典的OJ题_第2张图片

图例: 

起始:

顺序表经典的OJ题_第3张图片 

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

顺序表经典的OJ题_第4张图片 

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

顺序表经典的OJ题_第5张图片

随后src和dst都++

顺序表经典的OJ题_第6张图片 

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

代码输入:

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

 顺序表经典的OJ题_第7张图片

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

题目内容:

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

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

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

举例:

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

图例:

初始:

顺序表经典的OJ题_第8张图片 

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

顺序表经典的OJ题_第9张图片 

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

顺序表经典的OJ题_第10张图片 

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

顺序表经典的OJ题_第11张图片

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

顺序表经典的OJ题_第12张图片 

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

顺序表经典的OJ题_第13张图片 

代码输入:

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

顺序表经典的OJ题_第14张图片

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

你可能感兴趣的:(C语言,数据结构,算法,数据结构,顺序表,OJ题)