LeetCode刷题——双指针移除数组元素

Posted 林慢慢i

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode刷题——双指针移除数组元素相关的知识,希望对你有一定的参考价值。

前言:本章主要介绍双指针移除数组中特定元素的解题方式。

1.原地移除数组中所有的元素val

问题描述:

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

OJ链接

双指针思路:

考虑用 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;
}

以上是关于LeetCode刷题——双指针移除数组元素的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode刷题100天—27. 移除元素(指针)—day76

Leetcode刷题100天—27. 移除元素(指针)—day76

Leetcode刷题日记精选例题(附代码及链接)

图解双指针 | LeetCode 27. 移除元素

leetcode刷题之双指针(C++&Java)

27数组-移除元素