前言:本章主要介绍双指针移除数组中特定元素的解题方式。
文章目录
1.原地移除数组中所有的元素val
问题描述:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
双指针思路:
考虑用 2 个指针,一个在前记作 dst,一个在后记作 i,算法流程如下
1.比较 val 和 i位置的元素是否相等。
2.如果相等,i 后移 1 位;
3.如果不相等,再将i位置的元素复制到 dst 位置上,dst 后移一位,i 后移 1 位;
4.重复上述过程,直到 i 等于数组长度。5.返回 dst ,即为新数组长度。
绘图演示:
示例程序:
int removeElement(int* nums, int numsSize, int val){
int dst=0;
int src=0;
int i=0;
while(i<numsSize)
{
if(nums[i]==val)
{
i++;
}
else
{
nums[dst]=nums[i];
dst++;
i++;
}
}
return dst;
}
2.删除排序数组中的重复项
问题描述:
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
OJ链接
双指针思路:
首先注意数组是有序的,那么重复的元素一定会相邻。要求删除重复元素,实际上就是将不重复的元素移到数组的左侧。考虑用 2 个指针,一个在前记作 dst,一个在后记作 src,算法流程如下:
1.比较 dst 和 src 位置的元素是否相等。
2.如果相等,src 后移 1 位;
3.如果不相等,dst 后移一位,再将 src 位置的元素复制到 dst+1 位置上,src 后移 1 位;
4.重复上述过程,直到 src 等于数组长度。5.返回 dst + 1,即为新数组长度。
绘图演示:
示例程序:
int removeDuplicates(int* nums, int numsSize){
if(numsSize==0)
{
return 0;
}
int dst=0;
int src=0;
while(src<numsSize)
{
if(nums[dst]==nums[src])
{
src++;
}
else
{
dst++;
nums[dst]=nums[src];
src++;
}
}
return dst+1;
}