目录
[27. 移除元素-力扣](https://leetcode.cn/problems/remove-element/description/?languageTags=c)
[26. 删除有序数组中的重复项](https://leetcode.cn/problems/remove-duplicates-from-sorted-array/)
[88. 合并两个有序数组](https://leetcode.cn/problems/merge-sorted-array/)
下面的几道题,都运用一个双指针(下标)遍历法
27. 移除元素-力扣
示例1:
输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2]
示例2:
输入:nums = [0,1,2,2,3,0,4,2], val = 2 输出:5, nums = [0,1,4,0,3]
这道题最容易想到的思想是开辟一个新数组,然后遍历原数组,如果原数组中的某个值不等于val的值,就把这个值放到新数组中
如图:
最开始src指向的元素等于val,src向后走,des不变
src指向的值不等于val,所以将这个值放到des指向的空间中,接着src和des都向后移
接下来的步骤以此类推,最终会得到一个合适的数组
但是这个方法显然不满足题中要求的原地修改,但是我们可以借助这个思想,只不过是在原数组上进行操作
让src和des都指向原数组,其余步骤都与上面那个方法类似
最开始src指向的元素等于val,src向后走,des不变
接着src指向的元素的值不等于val,把这个值赋给des指向的空间中,接着src des向后挪
src指向的元素的值不等于val,把这个值赋给des指向的空间中,接着src des向后挪
src指向的元素等于val,src向后走,des不变
此时,src已经遍历出了数组,遍历结束,可以看到实际上操作后的数组就是[2,2],长度是2,也正好是作为下标的des的值,所以最后返回des的值。
代码如下:
int removeElement(int* nums, int numsSize, int val) { int des = 0; for (int src = 0; src < numsSize; src++) { if (nums[src] != val) { nums[des] = nums[src]; des++; } } return des; }